[gelöst]readyRead() kommt erst nach Prozessende

Alles rund um die Programmierung mit Qt
Antworten
Manto
Beiträge: 4
Registriert: 11. April 2007 18:23

[gelöst]readyRead() kommt erst nach Prozessende

Beitrag von Manto »

Hallo zusammen.
Ich habe folgendes Problem:
Ich starte aus einer Qt-Anwendung folgendermaßen einen Prozess:

Code: Alles auswählen

infoGatherProcess = new QProcess(this);
	connect(infoGatherProcess, SIGNAL(readyRead()), this, SLOT(dataAvail()));
	infoGatherProcess->start("/home/manto/DIPLOM/helloworld/debug/src/helloworld");
Der Prozess, der da gestartet wird ist ein kleines Testprogramm, das folgendermaßen aussieht:

Code: Alles auswählen

int main(int argc, char *argv[])
{
      printf("Quit by typing 'q'\n");
	
      while ( getchar() != (int)'q' ) 
     {
           printf("Quit by typing 'q'\n");
      }

      return EXIT_SUCCESS;
}
Es ist in c geschrieben.

Mein problem ist, dass ich gerne in meiner Anwendung sehen würde, was in dem Prozess passiert. Allerdings kommt das readyRead()-Signal erst, wenn der Prozess beendet ist (also, wenn ich dem Prozess ein "q" geschickt habe), obwohl vorher ja schon Ausgaben im Prozess gemacht werden.

Was mache ich falsch?

Hier zur komplettierung noch der Slot, der mit readyRead verbunden ist:

Code: Alles auswählen

void MainWindow::dataAvail()
{
      QByteArray test;
      test += infoGatherProcess->readAll();
      mainEdit->append(test);

}
Ach ja: das ganze passiert unter Qt4.2.2 und unter Linux.
Zuletzt geändert von Manto am 12. April 2007 17:27, insgesamt 1-mal geändert.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Probier mal ein:

Code: Alles auswählen

fflush(stdout);
nach jedem printf, bzw. wenn Du's mit cout bzw. cerr machst mit einem

Code: Alles auswählen

	std::flush(std::cout);
	std::flush(std::cerr);
Evtl. hilft das weiter und löst schon vor Ende der Applikation ein readyRead aus.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
May-C
Beiträge: 20
Registriert: 28. März 2007 20:37

Beitrag von May-C »

Vielleicht klappt es ja, wenn du es folgendermassen machst...

Code: Alles auswählen

infoGatherProcess = new QProcess(this);
infoGatherProcess->start("/home/manto/DIPLOM/helloworld/debug/src/helloworld");
infoGatherProcess->waitForStarted();
QByteArray test =  infoGatherProcess->readAll();
mainEdit->append(test);
Manto
Beiträge: 4
Registriert: 11. April 2007 18:23

Beitrag von Manto »

Sehr schön!
Die Flusherei hat geholfen.
Habt dank!
Antworten