mikrocontroller.net

Forum: PC-Programmierung TimeOut realisieren, wie?


Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SiO2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dave_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo domi

Ruft Deine Schleife regelmässig die Funkiotn ReadFile auf?

David

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.