Zeitlich definiertes Aussteigen aus einer while-Schleife
-
Hallo,
ich warte in einer while-Schleife auf ein bestimmtes Ereignis. Falls dieses Ereignis nicht eintrifft komme ich ohne eine bestimmte Bedingung nicht wieder aus dieser Schleife raus.
Ich möchte dies aber spätestens nach genau 1 Sekunde. Was wäre hier wohl am sinnvollsten?WhileBrecher
-
entweder du benutzt einen timer oder du merkst dir vor beginn der Schleife die systemzeit und prüfst innerhalb der schleife, ob eine sekunde bereits vergangen ist. (mit SecondsBetween oder MilliSecondsBetween)
-
Danke schonmal.
Kann ich den Timer nach seinem aktuellen Wert abfragen?
-
WhileBrecher schrieb:
Danke schonmal.
Kann ich den Timer nach seinem aktuellen Wert abfragen?
Frag doch einfach Enabled ab und setze Enabled beim ersten Timer-Ereignis
auf false.Gruß,
Alexander
-
So hab ich das auch schon probiert, komme jedoch wenn ich in der Schleife drin bin nicht zum OnTimer-Ereignis und dem darin platzierten Code.
-
so wird das auch nix
starte den timer vor deiner schleife und setzt bei OnTimer eine abbruchbedingung für deine schleife (z.B.: Abbruch = true)
in der While-Schleife testet du dann auf Abbruch
und vergess nicht den Timer im OnTimer-Ereignis auszuschalten
-
WhileBrecher schrieb:
So hab ich das auch schon probiert, komme jedoch wenn ich in der Schleife drin bin nicht zum OnTimer-Ereignis und dem darin platzierten Code.
Dann mußt Du in jedem Durchlauf Deiner Schleife vor dem Abprüfen der Enabled-
Eigenschaft dem Programm die Chance geben, Ereignisse zu verarbeiten. Ich bin
mir nicht ganz sicher, wie der Aufruf dafür lautet (in VB DoEvents). Das steht
aber bestimmt in der FAQ oder der Hilfe.Gruß,
Alexander
-
Jester2000 schrieb:
(mit SecondsBetween oder MilliSecondsBetween)
Wie soll das aussehen, in der Hilfe ist dazu nichts vermerkt?
-
Jester2000 schrieb:
so wird das auch nix
starte den timer vor deiner schleife und setzt bei OnTimer eine abbruchbedingung für deine schleife (z.B.: Abbruch = true)
in der While-Schleife testet du dann auf Abbruch
und vergess nicht den Timer im OnTimer-Ereignis auszuschaltenHabe ich genauso gemacht und kam nicht zur OnTimer-Routine.
-
WhileBrecher schrieb:
in der Hilfe ist dazu nichts vermerkt?
glaub ich nicht
TDateTime StartZeit = Now(); while(SecondsBetween(Now(), StartZeit)<1) { ... }
-
WhileBrecher schrieb:
Habe ich genauso gemacht und kam nicht zur OnTimer-Routine.
was genau hast du denn gemacht, zeig mal deinen sourcecode
-
WhileBrecher schrieb:
Habe ich genauso gemacht und kam nicht zur OnTimer-Routine.
Schau mal in diesen Beitrag rein. Das müßte eigentlich das Timer-Problem
lösen.Gruß,
Alexander
-
Hier die while-Schleife
var = 1; while (var) { if (ComGetEvent(Eingabe)) { var = 0; } if (TimerEmpfang->Enabled) { var = 0; } }
Und hier OnTimer
HeebMain->TimerEmpfang->Enabled = false;
-
machs mal so:
bool abbruch; // global definieren abbruch = false; Timer1->Enabled = true; while(!abbruch) { }
im OnTimer:
Timer1->Enabled = false; abbruch = true;
-
TTimer ist ohnehin nicht das Mittel der Wahl für das Ausloten eines Communication-Timeouts.... QueryPerformanceCounter() liefert hier viel bessere Ergebnisse.
Sehe ich das richtig, dass es darum geht, einen Timeout für den Datenempfang zu detektieren? Da gäbs nämlich elegantere Lösungen...
-junix
-
junix schrieb:
Sehe ich das richtig, dass es darum geht, einen Timeout für den Datenempfang zu detektieren? Da gäbs nämlich elegantere Lösungen...
-junix
un wat?
-
Mit CreateEvent, CloseHandle, WaitForSingleObject lassen sich ganz witzige Sachen machen (o: Wenn du nen Com-Port ansprichst, ist WaitCommEvent auch ganz Witzig. Vor Allem in Kombination mit WaitForSingleObject im OVERLAPPED-Betrieb.
Ausserdem würde ich dir raten, die Kommunikation mit einem TThread-Objekt vom Dialog abzukoppeln.
-junix
[edit]Links eingefügt[/edit]
-
junix schrieb:
Mit CreateEvent, CloseHandle, WaitForSingleObject lassen sich ganz witzige Sachen machen (o: Wenn du nen Com-Port ansprichst, ist WaitCommEvent auch ganz Witzig. Vor Allem in Kombination mit WaitForSingleObject im OVERLAPPED-Betrieb.
Ausserdem würde ich dir raten, die Kommunikation mit einem TThread-Objekt vom Dialog abzukoppeln.
[edit]Links eingefügt[/edit]Hallo junix,
danke schon mal für die Hilfen. Nur mit dem WaitForSingleObject komme ich nicht ganz klar, da ich auf ein fertige Kommunikationsbibiothek zurückgreife.
Mit ComGetEvent(Com-Port) bekomme ich entsprechend des Ereignisses ein Wert zurück. Wie muss ich das nun mit WaitForSingleObject verbinden um den PC nicht ständig zu überlasten (wie in einer while-Schleife), dem Warte-Thread jedoch eine hohe Priorität zu geben um keine Ereignisse an der Schnittstelle zu verpassen?
Wäre über Hilfe sehr dankbar.Gruß WhileBrecher
-
Was für eine Bibliothek nutzt du denn? Eine hauseigene?
-junix
-
junix schrieb:
Was für eine Bibliothek nutzt du denn? Eine hauseigene?
Nein, diese Bibliothek schimpft sich supercom.