Forum: PC-Programmierung Auf Asynchronen Event Warten mit Qt


von Tobias P. (hubertus)


Lesenswert?

Hallo Programmierfreunde,

ich habe ein spezielles Problem hier. Es gibt sicher eine Lösung dazu, 
aber mir fällt grad nicht ein, wie man das elegant lösen könnte. Also 
folgende Ausgangslage:

Ich starte mit QProcess() ein externes Programm, welches im Hintergrund 
läuft, und wo ich dann mittels write() Befehle absetzen kann. Mittels 
read() kann ich dann die Antworten (Ausgaben des Programms) lesen. Das 
funktioniert so lange gut, wie man das streng synchron macht. Leider 
kann mein externes Programm auch asynchron eine Ausgabe tätigen um z.B. 
irgend eine Meldung auszugeben. Damit ich immer gleich reagieren kann, 
wenn eine solche asynchrone Ausgabe auftritt, habe ich mittels connect() 
dem QProcess eine "Callbackfunktion" installiert, welche nun natürlich 
immer aufgerufen wird, wenn das ext. Programm irgend eine Ausgabe 
tätigt. Somit "frisst" der Event Handler auch meine Synchronen Antworten 
von dem Programm... Wie könnte man dies lösen?

Beispiel. Ich setze einen Befehl ab und empfange gleich die synchrone 
Antwort:

write("meinbefehl\n");
response = readAll();

Wenn nach dem Write allerdings eine Meldung kommt, dann empfange ich in 
respponse natürlich Mist. Kann ich irgend auf eine elegante Art warten, 
bis der Eventhander aufgerufen wurde, z.B. indem ich da irgend ein Flag 
setze und dann auf das Flag warte? Ist irgendwie Murks. Weiss jemand 
eine bessere Lösung?

von Rolf Magnus (Gast)


Lesenswert?

Hmm, wie wäre es damit:

Du liest ausschlielich in deinem Slot für asynchrone Nachrichten. Dort 
unterscheidest du zwischen diesen und den Antworten auf deine Kommandos. 
An irgendwas mußt du den Unterschied ja eh erkennen. Wenn es eine 
Antwort ist, merkst du dir die, z.B. in einem
1
QByteArray lastResponse;

Nach absetzen eines Kommandos rufst du nicht readAll() auf, sondern eine 
Funktion, die ungefähr so aussieht:
1
QByteArray readSynchronousResponse()
2
{
3
    QByteArray response;
4
    while (response.isEmpty())
5
    {
6
        process->waitForReadyRead();
7
        response = lastResponse;
8
    }
9
    lastResponse.clear();
10
    return response;
11
}

Ob das geht, weiß ich aber nicht. Das Problem ist halt, daß du synchrone 
und asynchrone I/O mischst.

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.