Zeitlich definiertes Aussteigen aus einer while-Schleife
-
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.
-
Von hier: http://www.adontec.com/ ?
^Kenn ich nicht, aber hier müsstest du wohl mit der ComGetSetEventProc irgendwie ne Funktion aufsetzen die mit Setevent einen Event feuert... hmmm Kenn leider die Library nicht aber ich nehme an die oben von mir genannte Funktion dient dazu eine Callback Funktion zu setzen welche bei (beliebigen) events aufgerufen wird?-junix
-
Hi,
das mit ComGetSetEventProc versteh ich gar nicht. Wie genau funktioniert CreateEvent und wie schaffe ich es das iich im entscheidenden Moment informiert werde?
Hat vielleicht jemand ein verständliches Beispiel mit kurzer Erklärung?Frage ich nämlich ständig den Port in einem Thread ab:
do { if (ComGetEvent(COM_1) == evRXRDY) { Readchar(); } if (Terminated) return; } while (true);
dann stürzt der Rechner nach ein paar Minuten ab. Die Prozessorauslastung beträgt in der aktiven Zeit ständig 100%.
Ich möchte aber unbedingt zu dem Zeitpunkt an dem das Zeichen am Com-Port ankommt darauf reagieren, da ich die Zeitinformation benötige.
Vielleicht kann mir jemand helfen.
Gruß WhileBrecher
-
Haste mir mal irgendwo die Doku zu der API der Library? Dann kann ich dir vielleicht mal helfen ... Speziell zur Doku zur ComGetSetEventProc....
-junix
-
Also das mit dem Timer funktioniert natürlich nicht, da du dich doch die ganze Zeit mit der while-Schleife in der WindowProc deiner Form befindest. Ein Application->ProcessMessages() in der Schleife sollte das Problem beheben. Ansonsten geht das hier auch:
DWORD ms = GetTickCount(); while( GetTickCount() < ms + 1000 ) { // Was immer du da auch machen willst }
-
falls zu erwarten ist, dass das proggi auf einem rechner läuft, der rund um die uhr an ist (z.B. ein Server) dann sollte man beachten, dass die Schleife von WebFrizi unter Umständen in eine Endlosschleife verfällt
nach 49.7 Tagen schlägt GetTickCount auf 0 um.
der fall tritt sicherlich sehr sehr selten ein, aber ihr kennt ja alle murphy. die fehler treten immer da auf, wo man es am wenigsten erwartetLösung:
#include <math.h> . . . DWORD ms = GetTickCount(); while( abs(GetTickCount() - ms) >= 1000 ) { // Was immer du da auch machen willst }