Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie kann ich DAS realisieren? (https://www.delphipraxis.net/91814-wie-kann-ich-das-realisieren.html)

KRM 10. Mai 2007 11:46


Wie kann ich DAS realisieren?
 
Hallo Leute,

ich brauch mal wieder Hilfe...

Mein Delphi-Projekt, das hier schon mal "angeritzt" wurde (Screenshot) wächst gut ;)...

Nun hänge ich an folgendem Punkt:

Ich möchte gerne, dass bei einem Buttonklick die ganze Zeit auf dem USB-Port herum gelauscht und Signale empfangen werden.
Kommen neue Daten an, soll eine Funktion (z.B. ändern der Lautstärke des PCs) ausgeführt werden.

Aktuell ist es halt so, dass ich einmal den Button gedrückt, nicht mehr aus der Schleife raus komme...

Diese "Endlosschleife" soll aber nur solange laufen, BIS entweder über eine MessageBox oder die Taste ESC ein Abbruch vom Benutzer gewünscht wird (ob durch Taste oder später als Icon in der Taskleiste ist mir egal)...

Jedenfalls weiß ich nicht:

Kann ich in dieser "Endlosschleife" irgendwie abfragen, ob der Benutzer ESC gedrückt hat?
Muss ich das ganze über Threads realisieren?


Mir fehlt da ein Ansatz...

Habt ihr eine Idee?

alzaimar 10. Mai 2007 11:58

Re: Wie kann ich DAS realisieren?
 
Am Besten machst du sowas in einem Thread.

Es reicht aber auch das hier:

Delphi-Quellcode:
Procedure TMyForm.MyButtonClick (Sender : TObject);
Begin
  Repeat
    DoSomething;
    Application.ProcessMessages;
  Until UserPressedCancelButton;
  UserPressedCancelButton := False;
End;

Procedure TMyForm.CancelButtonClock (Sender : TObject);
Begin
  UserPressedCancelButton := True;
End;
Da Du mit 'Application.ProcessMessages' die Nachrichtenverarbeitung am Laufen hältst, kannst Du auf den 'CancelButton' klicken und das Event wird auch ausgelöst.

himitsu 10. Mai 2007 12:14

Re: Wie kann ich DAS realisieren?
 
ich glaub so läuft es besser :angel:
Code:
Procedure TMyForm.MyButtonClick (Sender : TObject);
Begin
  [b]UserPressedCancelButton := False;[/b]
  Repeat
    DoSomething;
    Application.ProcessMessages;
  Until UserPressedCancelButton;
End;
Wenn DoSomething unter 100ms (Erfahrungswert) benötigt dann ist das Programm noch "gut" bediehnbar.
Darüber fängt es störend an zu stocken, weßhalb sich da der Aufwand für einen Thread voll rentiert.

alzaimar 10. Mai 2007 12:17

Re: Wie kann ich DAS realisieren?
 
Nee, himitsu.

Das kommt ins FormCreate, und wenn die Schleife abgebrochen wurde, dann muss das Flag ja wieder zurückgesetzt werden. War also schon rischtisch.

[edit] Wir nehmen den Mittelwert
Delphi-Quellcode:
Procedure TMyForm.MyButtonClick (Sender : TObject);
Begin
  UserPressedCancelButton := False;
  Repeat
    DoSomething;
    Application.ProcessMessages;
  Until UserPressedCancelButton;
  UserPressedCancelButton := False;
End;

himitsu 10. Mai 2007 12:26

Re: Wie kann ich DAS realisieren?
 
Zitat:

Zitat von alzaimar
Das kommt ins FormCreate

Dann hättest du aber FormCreate mit angeben sollen.

Aber vorher macht sich dennoch oftmals besser.

Denn diese Variable wird ja nur innerhalb der Schleife verwendet, weßhalb ein nachfolgendes Zurücksetzen erst beim nächsten Mal verwendet wird.

Beim Davorsetzen kann man sich die Zuweisung in OnCreate sparen.


Zitat:

* nachher
> Programm starten / Form erstellen (x=false)
> Stopp-Button drücken (x=true)
> Abarbeitung/Schleife starten (if x)
= Schleife wird sofort wieder abgebrochen
> Variable zurücksetzen (x=false)
Zitat:

* vorher
> Programm starten / Form erstellen
> Stopp-Button drücken (x=true)
> Variable zurücksetzen (x=false)
> Abarbeitung/Schleife starten (if x)
= Schleife wartet auf's Drücken des Stopp-Buttons

PS: zum Mittelwert :angel2:
Code:
UserPressedCancelButton := False;
Repeat
  DoSomething;
  Application.ProcessMessages;
Until UserPressedCancelButton;
[b]UserPressedCancelButton := False;

UserPressedCancelButton := False; [/b]
Repeat
  DoSomething;
  Application.ProcessMessages;
Until UserPressedCancelButton;
UserPressedCancelButton := False;

alzaimar 10. Mai 2007 12:33

Re: Wie kann ich DAS realisieren?
 
Zitat:

Zitat von himitsu
Dann hättest du aber FormCreate mit angeben sollen.

Wieso? Ich soll doch kein vollständiges Programm schreiben.

Zitat:

Zitat von himitsu
Denn diese Variable wird ja nur innerhalb der Schleife verwendet, weßhalb ein nachfolgendes Zurücksetzen erst beim nächsten Mal verwendet wird.

Nope, vielleicht auch im 'OnClose'.. wäre jedenfalls cool, wenn sie dort auch gesetzt würde. Oder bei irgendwelchen anderen Buttons. Außerdem gibts vielleicht noch eine Schleife, die das benötigt. Grundsätzlich sollte Code hinter sich aufräumen, damit er reentrant ist (wenn er es denn sein soll).

Den Rest kapier ich nicht.

KRM 10. Mai 2007 12:40

Re: Wie kann ich DAS realisieren?
 
Leute, ihr seit mal wieder die besten ;)...

Ok, es funktioniert!
VIELEN DANK!

Ich habe
Delphi-Quellcode:
Application.ProcessMessages;
An zwei Stellen eingebaut, da DoSomething; leider auf jeden fall (durch wartezeiten, in denen der USB-Bus abgefragt wird) länger als 100ms benötigt.

Doch das mit den Threads habe ich eben (durch das Borland Beispiel mit den Sortieralgorithmen) auf die schnelle nicht gecheckt und umsetzen können :(...

Robert Marquardt 10. Mai 2007 12:41

Re: Wie kann ich DAS realisieren?
 
Reden wir hier ueber meine HID-Komponente? Selbst wenn nicht, so solltest du sie dir mal anschauen. Es wird ein OnData-Event per Thread implementiert. Der Thread zeigt auch was fuer Feinheiten es beim Lesen gibt. Man muss z. B. mit Timeout lesen, damit der Thread auch beendet werden kann.

KRM 10. Mai 2007 12:42

Re: Wie kann ich DAS realisieren?
 
@ alzaimar


Ich hatte

Delphi-Quellcode:
UserPressedCancelButton := False;
eh schon an beide Stellen geschrieben ;)


Einmal in Create und einmal kurz bevor die Hauptschleife aufgerufen wird ;)..
Weil das Button soll ja mehrmals angeklickt werden können ;)

KRM 10. Mai 2007 12:45

Re: Wie kann ich DAS realisieren?
 
Zitat:

Zitat von Robert Marquardt
Reden wir hier ueber meine HID-Komponente? Selbst wenn nicht, so solltest du sie dir mal anschauen. Es wird ein OnData-Event per Thread implementiert. Der Thread zeigt auch was fuer Feinheiten es beim Lesen gibt. Man muss z. B. mit Timeout lesen, damit der Thread auch beendet werden kann.


Was für eine HID Komponente?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz