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