![]() |
Wie kann ich DAS realisieren?
Hallo Leute,
ich brauch mal wieder Hilfe... Mein Delphi-Projekt, das ![]() 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? |
Re: Wie kann ich DAS realisieren?
Am Besten machst du sowas in einem Thread.
Es reicht aber auch das hier:
Delphi-Quellcode:
Da Du mit 'Application.ProcessMessages' die Nachrichtenverarbeitung am Laufen hältst, kannst Du auf den 'CancelButton' klicken und das Event wird auch ausgelöst.
Procedure TMyForm.MyButtonClick (Sender : TObject);
Begin Repeat DoSomething; Application.ProcessMessages; Until UserPressedCancelButton; UserPressedCancelButton := False; End; Procedure TMyForm.CancelButtonClock (Sender : TObject); Begin UserPressedCancelButton := True; End; |
Re: Wie kann ich DAS realisieren?
ich glaub so läuft es besser :angel:
Code:
Wenn DoSomething unter 100ms (Erfahrungswert) benötigt dann ist das Programm noch "gut" bediehnbar.
Procedure TMyForm.MyButtonClick (Sender : TObject);
Begin [b]UserPressedCancelButton := False;[/b] Repeat DoSomething; Application.ProcessMessages; Until UserPressedCancelButton; End; Darüber fängt es störend an zu stocken, weßhalb sich da der Aufwand für einen Thread voll rentiert. |
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; |
Re: Wie kann ich DAS realisieren?
Zitat:
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:
Zitat:
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; |
Re: Wie kann ich DAS realisieren?
Zitat:
Zitat:
Den Rest kapier ich nicht. |
Re: Wie kann ich DAS realisieren?
Leute, ihr seit mal wieder die besten ;)...
Ok, es funktioniert! VIELEN DANK! Ich habe
Delphi-Quellcode:
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.
Application.ProcessMessages;
Doch das mit den Threads habe ich eben (durch das Borland Beispiel mit den Sortieralgorithmen) auf die schnelle nicht gecheckt und umsetzen können :(... |
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.
|
Re: Wie kann ich DAS realisieren?
@ alzaimar
Ich hatte
Delphi-Quellcode:
eh schon an beide Stellen geschrieben ;)
UserPressedCancelButton := False;
Einmal in Create und einmal kurz bevor die Hauptschleife aufgerufen wird ;).. Weil das Button soll ja mehrmals angeklickt werden können ;) |
Re: Wie kann ich DAS realisieren?
Zitat:
Was für eine HID Komponente? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr. |
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