![]() |
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? |
Re: Wie kann ich DAS realisieren?
Wenn der Code "reentrant" sein soll, dann dürfte die Variable in/vor/nach der Schleife garnicht gesetzt werden, wenn du damit meinst daß man mehrere derartige Schleifen über die selbe Variable steuern will.
Diese würden sich ja sonst gegenseitig beeinflussen. Vorher Setzen: StoppButton gedrückt und danach eine Schleife getartet Wird hier die Schleife gerade gestartet, also die variable X wieder auf False gesetzt, bevor die laufende Schleife die Variable abfragen kann, so wird diese nicht beendet, da die Variable ja inzwischen wieder zurückgesetzt wurde. Nachher Setzen: mehrer Schleifen sind am Laufen und Stopp wird gedrückt Hier setzt die Schleife welche zuerst zur Abfrage kommt die Variable zurück, so daß die andere Schleife nicht mehr beendet wird. zu den Quotes: hatte 'nen Buttonclick vergessen (is nun eingefügt) ... es zeigt nur ein unterschiedliches Stopp-Button-Verhalten, wenn man Stopp mal vor dem Start ausführt. Zitat:
|
Re: Wie kann ich DAS realisieren?
Zitat:
![]() Was machst du da denn genau? Dem Screenshot nach hast du einen IR-Empfanger und -Sender. Solche Geraete werden gerne als HID-Geraete (eine Unterklasse von USB-Geraeten implementiert). |
Re: Wie kann ich DAS realisieren?
Zitat:
Ich arbeite auf Basis dieser ![]() ![]() ![]() Zitat:
Liegt schon ganz richtig ;)... Ich habe ein USB-Device mit einem Microcontroller realisiert http://www.delphipraxis.net/download.php?id=26136. diesem device schicke ich mit Hilfe der DLL befehle zu, primär handelt es sich dabei natürlich um den Empfang oder das Senden von Infrarot Signalen. Beides funktioniert mittlerweile so weit, dass ich eben gespeicherte IR-Rahmen senden kann (um damit den Fernseher meiner Freundin auszuschlaten ;) ) oder von der Fernbedienung empfangene IR-Rahmen speichern kann. Der letzte Schritt (dieser Studienarbeit) ist es, dass ich das Delphiprogramm im Hintergrund laufen lassen kann, damit ich dauerhaft mich z.B. auf die Couch setzen kann, auf dem Laptop jedoch einen Film schaue und mit der Fernbedienung den Laptop bediene. Nur habe ich vor diesem Projekt noch nie etwas in Delphi gemacht, geschweige denn in Pascal (bin mit C aufgewachsen und habe ein Semester in Java rumgespielt) und weiß deshalb nicht um die Möglichkeiten, die mir zur Verfügung stehen... Der Code ist deswegen wahrscheinlich auch ein wenig sehr... ehm... naja, nicht spaghetti, aber Tortillini oder so... Allerdings bemühe ich mich eben sämtliche Fehlereingaben von Benutzern abzufangen, etc. Tipps jeglicher Natur nehme ich daher dankend an ;)... Wenn du magst, schicke ich dir die Studienarbeit zu, dann bekommst du vllt einen besseren Einblick in die Arbeit |
Re: Wie kann ich DAS realisieren?
Ist das Device ein HID-Device oder nicht? Wenn ja, dann laesst es sich per HID-Komponente ansteuern.
Die Source der HID-Komponente nuetzt einem Delphi-Anfaenger nicht allzuviel. Da sind doch so einige Tricks mit einem ungewoehnlichen Design verbunden. Ich werfe gerne einen Blick auf die Studienarbeit. An robert_marquardt at gmx dot de schicken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 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