AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich DAS realisieren?

Offene Frage von "KRM"
Ein Thema von KRM · begonnen am 10. Mai 2007 · letzter Beitrag vom 10. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
KRM

Registriert seit: 6. Feb 2007
Ort: Kölle am Rhing
24 Beiträge
 
Turbo Delphi für Win32
 
#1

Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 11:46
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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 11:58
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#3

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:14
ich glaub so läuft es besser
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:17
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#5

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:26
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
Code:
UserPressedCancelButton := False;
Repeat
  DoSomething;
  Application.ProcessMessages;
Until UserPressedCancelButton;
[b]UserPressedCancelButton := False;

UserPressedCancelButton := False; [/b]
Repeat
  DoSomething;
  Application.ProcessMessages;
Until UserPressedCancelButton;
UserPressedCancelButton := False;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:33
Zitat von himitsu:
Dann hättest du aber FormCreate mit angeben sollen.
Wieso? Ich soll doch kein vollständiges Programm schreiben.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
KRM

Registriert seit: 6. Feb 2007
Ort: Kölle am Rhing
24 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:40
Leute, ihr seit mal wieder die besten ...

Ok, es funktioniert!
VIELEN DANK!

Ich habe
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 ...
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:41
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.
  Mit Zitat antworten Zitat
KRM

Registriert seit: 6. Feb 2007
Ort: Kölle am Rhing
24 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:42
@ alzaimar


Ich hatte

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
  Mit Zitat antworten Zitat
KRM

Registriert seit: 6. Feb 2007
Ort: Kölle am Rhing
24 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Wie kann ich DAS realisieren?

  Alt 10. Mai 2007, 12:45
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz