alarm() und SIGALRM unter Windows?
-
Hallo,
unter Linux gibt es ja die im Titel genannte Funktion, die mir nach einer bestimmten Zeit ein Signal schickt und ich dadurch eine Funktion ausführen kann.
Gibt es sowas auch für Windows CE?Ich brauche etwas, dass mein Programm aus einem schlafenden Zustand rausholt.
Um genau zu sein: es ist eine Funktion, die über COM-Port Daten einliest.
Mit WaitCommEvent() warte ich in dieser Funktion auf bytes. Aber falls keine Bytes kommen soll es nicht auf ewig dort hängen bleiben. Also habe ich mir erhofft es gibt eben ein alarm(), mit dessen Hilfe nach einer bestimmten Zeit eine Signal kommt, dass mein Programm aus dem WaitCommEvent reisst.Einfach ein globals Flag zu setzen ist eine blöde lösung da ich beim einlesen vom COM-Port nicht pollen möchte.
Hoffe, dass meine erklärung verständlich war.
Edit: Nach etwas googeln habe ich nun gelesen, dass Windows nichts ähnliches hat wie Linux. Also ich kann auch keine Signale an Threads schicken.
Hat mir jemand einen Tip wie ich einen Thread dennoch aus dem WaitCommEvent() rausholen kann um dann den Thread eigentlich nur noch zu beenden.
-
Hast Du wahrscheinlich schon gesehen:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363479%28v=vs.85%29.aspx
hier wird aud die wait functions verwiesen unter http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx
Denke da sollte was für Dich dabei sein.
-
Ich verstehe nicht ganz. Während mein Programm im WaitCommEvent() festhängt, würde mir eine andere Funktion, die Wartet auch nichts bringen oder nicht?
Oder soll die WaitCommEvent() Funktion durch eine andere ersetzt werden?
-
Ich verstehs so, das man mit einer der wait-function den Zustand des Objekts hier vom WaitCommEvent event abfragen kann und und danach abbrechen kann.
z.B. kannst Du mit WaitForSingleOject einen timeout setzen.
-
Hier würde ich overlapped i/o einsetzen.
D.h. Du startest Deinen Read un in diesem Fal kehrt das System sofort zurück. Du bekommst ein Event gesetzt wenn die Operation fertig ist. Dein Thread hat also die Möglichkeit zu entscheinden ob er warten will und wenn ja wiel lange und worauf...Siehe hier:
http://msdn.microsoft.com/en-us/library/ms810467.aspxWie man es ohne overlapped I/o macht ist hier beschrieben:
http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c5425
-
Danke noergel.
Hab die Sache gelesen und dann noch etwas im Internet geschaut.
Habe diesen Artikel gefunden:
http://www.codeproject.com/Articles/2682/Serial-Communication-in-Windows
Unter der Überschrift "Event Driven Approach" steht genau das beschrieben, was ich gerne hätte, das auch funktioniert hätte und eine nette Lösung wäre.
Jetzt stellt sich mir nur ein Problem.
Das Funktioniert nicht unter Windows CE.BOOL WaitCommEvent(HANDLE hCommPort, LPDWORD dwEvtMask,LPOVERLAPPED lpOverlapped);
Der dritte Parameter wäre die Lösung und genau dieser wird in Windows CE ignoriert.
http://msdn.microsoft.com/en-us/library/aa909008.aspxUnd Martin war etwas schneller mit dem Tippen als ich. Dein Ansatz läuft leider nicht, wie oben beschrieben.
Edit: Mist du hast sogar den selben Artikel wie ich gefunden.Tut mir Leid. Jetzt wird mir erst klar, dass ich jedes mal dazu schreiben sollte, dass es Windows CE ist. Ich vergesse immer, dass es wohl erhebliche Unterschiede gibt aber ich programmiere mit Windows erst seit 2 - 3 Wochen. Sorry.