Forum: PC-Programmierung TimeOut realisieren, wie?


von domi (Gast)


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

von SiO2 (Gast)


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.

von Karl heinz B. (kbucheg)


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.

von domi (Gast)


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

von Dave_ (Gast)


Lesenswert?

Hallo domi

Ruft Deine Schleife regelmässig die Funkiotn ReadFile auf?

David

von Karl heinz B. (kbucheg)


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.

von domi (Gast)


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

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
Noch kein Account? Hier anmelden.