Delphi-PRAXiS

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?

himitsu 10. Mai 2007 12:47

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:

PS: zum Mittelwert
= doppelte Zuweisung, wenn mehrmals hintereinander die Schleife gestartet wird ... einmal reicht.

Robert Marquardt 10. Mai 2007 13:09

Re: Wie kann ich DAS realisieren?
 
Zitat:

Zitat von KRM
Was für eine HID Komponente?

Du steuerst USB-Geraete an und hast noch nie von meiner HID-Komponente gehoert? http://www.soft-gems.net hostet sie.

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).

KRM 10. Mai 2007 13:42

Re: Wie kann ich DAS realisieren?
 
Zitat:

Zitat von Robert Marquardt
Du steuerst USB-Geraete an und hast noch nie von meiner HID-Komponente gehoert? http://www.soft-gems.net hostet sie.

ehm...-duck-... ist es schlimm wenn ich sage: "noch nicht" :P
Ich arbeite auf Basis dieser DLL, die auch Sprut in seinem USB Beispiel verwendet ;)

Zitat:

Zitat von Robert Marquardt
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).


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

Robert Marquardt 10. Mai 2007 14:14

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