Hallo, ich programmiere gerad ein Windows-Programm in C++ mit MFC, welches beim Betätigen von Buttons verschiedene Befehle über die serielle Schnittstelle an einen Mikrocontroller sendet und dann in einer While-Schleife auf eine Antwort wartet. Wenn aber mal etwas schief geht und keine Antwort kommt, bleibt das Programm hängen. Wie kann ich sozusagen einen Timeout einbauen, der die While-Schleife nach einer Sekdunde abbricht? Mein bisheriger Versuch: ein globales Flag wird vor der While-Schleife gelöscht. Dann wird ein Timer mit SetTimer(...) gestartet. Die WM_TIMER fange ich ab und setze dort das Flag. Das Flag dient als Abbruchkriterium für die While-Schleife. Leider funktioniert es nicht. Die OnTimer() meines Dialoges wird nie aufgerufen. Hat jemand eine Idee woran das liegen könnte oder wie man es eleganter lösen kann? Gruß, Domi
Elegant ist mein Vorschlag nicht unbedingt, sollte aber gehen. Einfach Pollen;) Oder nen 2. Thread starten, der sich um das lesen kümmert, und vom "Hauptthread" gekillt wird, wenn er nicht rechtzeitig antwortet. Elegant wäre es (denke ich) wenn du mit Signalen arbeitest, und die Serielle sich meldet, wenn was da ist. Kann dir aber keine Beispile bringen, weil ich es noch nicht selbst gemacht habe.
Das Problem ist, das wenn dein Timer feuert, er eine Message in die Messagequeue stellt. Das wars dann auch schon und der Timer legt sich wieder schlafen. D.h. der Engpass, den du siehst, besteht darin, dass dein Pgm die Messagequeue nicht mehr auswertet weil es ja in der while Schleife hängt. Was kannst du dagegen tun. * Du könntest innerhalb der while-Schleife dafür sorgen, dass die MessageQueue weiterhin beobachtet und ausgewertet wird. Das kann man zb. mit der klassischen C PeekMessage/TranslateMessage (Ich hoffe ich hab das noch richtig im Kopf) machen. * Ich denke auch in CWinApp gibt es eine Funktion, die die Message Pumpe mal kurz anwirft und so dafür sorgt, dass Messages verteilt werden * Der beste Ansatz wäre allerdings, das ganze gar nicht mittels einer Warteschleife zu machen. Schicke das Zeugs über die Serielle raus und setzte dir ein paar Variablen auf welche Antwort du wartest und lass das Pgm weiterlaufen. Wenn dann von der Seriellen was herein- kommt, schaust du dir die vorher gesetzten Variablen an und entscheidest was mit dem von der Seriellen gelesenen zu passieren hat.
Danke für die bisherigen Antworten! In Sachen MFC bin ich leider erst Einstiger, also soll es so einfach wie möglich werden. Also werde ich wohl bei der While-Schleife bleiben. Es kommt wahrscheinlich später eh nur sehr selten vor, dass das Programm länger in der Schleife bleibt. Ich mach das nun einfach über die Systemzeit, die ich mir vor der Schleife einmal merke und dann in der Schleife prüfe
Hallo domi Ruft Deine Schleife regelmässig die Funkiotn ReadFile auf? David
> Ich mach das nun einfach über die Systemzeit, die ich mir vor der > Schleife einmal merke und dann in der Schleife prüfe :-) Das sind dann die Programme, deren Fenster minutenlang nicht upgedated werden; bei denen man auf das 'Schliessen-X' klickt und nichts passiert; die beim Fensterverschieben erst mal nichts tun, bis dann plötzlich irgendwann das Fenster hüpft; etc. Windows ist, so wie die meisten GUI Systeme, nun mal Event-getrieben. Wenn man nicht nach den Spielregeln spielt, gibst lustige Überraschungen. Warteschleifen sind in einem Event-System nun mal gegen die Spielregeln.
@Dave: Ja tut sie, aber bei mir kommt sie sofort zurück, egal, ob Daten da sind oder nicht. @Karl Heinz Buchegger: Du hast natürlich recht, dass es so nicht optimal ist. Ich werde es erstmal auf diese Weise lösen und später dann ersetzen. Außerdem wird's bei mir max. nur eine Sekunde sein. domi
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.