TimeOut realisieren, wie?

Gast #439764
Lesenswert?

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
Gast #439768
Lesenswert?

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.
#439822
Lesenswert?

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.
Gast #439857
Lesenswert?

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
#439993
Lesenswert?

> 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.
Gast #440082
Lesenswert?

@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren