Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

while (TRUE)

Danni_KA / 3 Antworten / Baumansicht Nickles

Hallo, habe leider ein Problem mit meinen Programmierkentnissen in MFC Visual C++. Ich habe eine while schleife laufen, in der ständig von der seriellen schnittstelle Daten abgefragt werden! Leider kann ich die Schleife nicht durch einfache Eingabe der escape-Taste oder einer beliebigen Taste verlassen. Das Programm rennt die ganze Zeit durch die schleife und lässt mir keine Möglichkeit die Ergebnisse anzuzeigen, bzw. die Schleife abzubrechen! Weiß jemand wie man das am einfachsten bewerkstelligen kann, das bei Tastendruck die Schleife beendet?


Vielen Dank und frohes Fest ;)

bei Antwort benachrichtigen
Andreas42 Danni_KA „while (TRUE)“
Optionen

Hi!

Das ist weniger ein Problem des Abbrechens, hier ist der ganze Ansatz nicht optimal.

Wenn du mit modernen Entwicklungsumgebungen arbeitest, musst du dich von der klassischen Programmierung mit ihren Schleifen lösen. In modernen objektorientierten Umgebungen wird auch ereignisorientiert gearbeitet.

Soll bedeuten, man schreibt Routinen, die automatisch aufgerufen werden (sie sind mit einem ereignis verbunden und werden dann aufgerufen, wenn dieses Ereignis eintritt). In solchen Routinen sollte man auf Schleifen ohne feste Abbruchbedingung verzichten, dam man damit die Bearbeitungskette der Ereignisse unterbricht.

Zurück zu deinem Problem: die serielle Schnittstelle hat einen eingebauten Puffer, der einige Zeichen halten kann, bevor sie überläuft. Evtl. kann man diesen Puffer soagr vergrössern, ich weiss dass gar nicht so genau.

Ich schreibe das, weil damit auch klar wird, dass man das Auslesen von Zeichen an der seriellen Schnittstelle durchaus unterbrechen kann.
Aber eigentlich muss man unter Win32 sich gar keine Gedanken um zeichenweises Abfragen der seriellen Schnittstelle machen. Dazu gibt's fertige DLLs und COM-Objekte.

Ein Link zu den Grundlagen findest du hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

Andere Hilfen lassen sich mit Google aufstöbern:
http://www.google.de/search?hl=de&q=visual+c%2B%2B+serial+port&btnG=Google-Suche&meta=

Bis dann
Andreas

Ich würde die Auslessfunktion an einen Interupt hängen und dann zyklisch auslösen lassen. Falls dann Zeichen anliegen.

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
mr.escape Danni_KA „while (TRUE)“
Optionen

Ohne codebeispiel ist es etwas schwer, aber evtl. könnte

SHORT GetAsyncKeyState(
  int vKey // virtual-key code
);

helfen, wobei hier für vKey
VK_ESCAPE
stehen sollte.
In der antwort ist das MSB gesetzt, wenn die taste gedrückt ist und das LSB, wenn dieses seit der letzten abfrage geschah (diese "letzte" abfrage kann aber auch ein anderer prozess gemacht haben!)

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
d-oli Danni_KA „while (TRUE)“
Optionen

Hi

Wenn du mit modernen Entwicklungsumgebungen arbeitest, musst du dich von der klassischen Programmierung mit ihren Schleifen lösen. In modernen objektorientierten Umgebungen wird auch ereignisorientiert gearbeitet.
Stimmt. While( true ) erinnert mich allerdings an Hintergrund-Prozesse. In diesem Fall könnte das Problem per IPC (Inter Process Communication) gelöst werden. Mit anderen Worten würdest du dann ein Programm erstellen, dass es ermöglicht das anderen laufenden Programm ("Prozess") zu stoppen.

Ich kenne mich nicht aus mit Windows Systemprogrammierung, aber mit google lässt sich da bestimmt was finden.

Gruss, d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen