QCoreApplication::processEvents
-
Hi,
könnte mir jemand erklären was oben genannte Methode macht bzw. auch allgemein was zu der Klasse sagen? Hab mir die Dokumentation angeschaut, aber werde nicht wirklich schlau daraus. Denke mal, dass es sich hierbei ja um eine wichtige Klasse handelt, verstehe aber zumindest auf englisch die Funktion der einzelnen Methoden nicht. Aaus der Einleitung sehe ich, dass es um eine "Ereignisschleife" geht und das QCoreApplication alle Anwendungen "verwaltet". Vielleicht kann ja jemand was dazu sagen.
-
Das ist eine nützliche Funktion. Stell dir vor du hast ein Button, was angeklickt und dann eine lange Berechnung durchführt. Die Berechnung ist nicht in einen Thread ausgelagert. Damit z.B. ein Abbruchsbutton erreichbar ist(bzw. die gesamt GUI) könntes du bei jeder Schleifenwiederholung app->processEvents() aufrufen. Bevor er nun weiterrechnet, wird erst überprüft, ob anderes Events vorliegen. Das ist z.B. das Klicken eines Abbruchbuttons, sodass deine Berechnung abgebrochen wird. Dies ist nur ein Beispiel. Ich verwende die Funktion noch an vielen weiteren Stellen. Das ist aber immer situationsabhängig...
-
Hi,
erstmal danke für die Antwort. Einiges ist mir aber noch unklar:
1. Was ist genau ein Thread? Hatte das auch in der Qt Doku gelesen, konnte aber nicht genau die Bedeutung des Wortes raus bekommen.
Damit z.B. ein Abbruchsbutton erreichbar ist(bzw. die gesamt GUI) könntes du bei jeder Schleifenwiederholung app->processEvents() aufrufen. Bevor er nun weiterrechnet, wird erst überprüft, ob anderes Events vorliegen.
Von welcher Schleife sprichst Du hier?
Werd mich auf jeden Fall schonmal in das Thema Thread einlesen sofern ich was gescheites finde.
-
- Google->Thread. Erster Treffer ist (wie so oft) Wikipedia.
- IRGEND EINE Schleife, die lange braucht und deshalb die Eventqueue blockiert, was deine GUI einfrieren lässt.
-
- Google->Thread. Erster Treffer ist (wie so oft) Wikipedia.
Les ich mir durch ;).
- IRGEND EINE Schleife, die lange braucht und deshalb die Eventqueue blockiert, was deine GUI einfrieren lässt.
Verstehe ich immer noch nicht ganz. Sagen wir mal ich rufe einen Prozess mit QProcess auf, der meine GUI einfriert. Das Event dieses Prozesses wird dann sozusagen aufgerufen/abgehandelt und dazu friert die GUI bis auf weiteres ein - keine anderen Aktionen sind in der GUI Anwendung erstmal soweit dann möglich. Wo ist denn hier jetzt aber genau die angesprochene Schleife?
-
Chaka schrieb:
Sagen wir mal ich rufe einen Prozess mit QProcess auf, der meine GUI einfriert.
Ein Prozess mit QProcess gestartet wird sicher NICHT blockieren (außer du verwendest Methoden, die explizit auf den Prozess warten). Den Rest deiner Aussage hab ich mal weggeschnippelt, da du einfach noch nicht verstehst, von was du reden willst.
Eine Schlife ist so ein Konstrukt mit for oder while.
while(bedingung) { tu_was_ganz_aufwaendiges(); }
Das rödelt und rödelt und blockiert somit andere nötige Aufgaben, die in einer GUI anfallen wie z.B. Widgets neu zeichnen, oder andere Aktionen wie den Click auf den "Abbrechen"-Button bearbeiten. Um diese Sachen (die üblicherweise in einer Eventloop laufen) doch abarbeiten zu können, packst du das processEvents() IN die Schleife.
Ist aber nicht so dolle, eine Lösung über Threads (die nicht blockieren, da sie parallel zum GUI-Thread laufen) wäre schöner.
-
Ok, habs verstanden, denke ich. Hab meinen Prozess mit einer while(!waitForFinished()) Schleife gekoppelt und deswegen friert die GUI ein.
Ich dachte schon innerhalb von QApplication gäbe es da irgendeine Schleife, jetzt hab ich es aber begriffen.Vielleicht kann ich ja noch ne Frage stellen :):
Hab hier etwa folgenden Quelltext:
void Processmethod() { QDialog *ProcessMessage = new QDialog; Ui::DialogProcessMessage Dialog; Dialog.setupUi(ProcessMessage); ProcessMessage->setModal(true); ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); ProcessMessage->show(); qApp->processEvents(); processmethodONE(); processmethodTWO(); processmethodTHREE(); } //Beispielhaft die Methode "processmethodONE();" void processmethodONE() { QString ProcessCommand = "runit"; Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly Prozess.setStandardOutputFile(Path); //defined in my class Prozess.start(ProcessCommand); while(!Prozess.waitForFinished(2000)) { std::cerr << "Process running " << std::endl; } QProcess::ExitStatus Status = Prozess.exitStatus(); if (Status == 0) { std::cout << "File created!" << std::endl; } }
So, jetzt friert mir die GUI immer bei Prozessausführung (while Schleife) ein, was ja auch gut ist. Jetzt hab ich aber zwei Probleme:
1. Der Inhalt des aufgerufenen Popup Dialoges wird nicht angezeigt, d.h. kein Text(QLabel) und kein QpushButton.
2. Wie mache ich den Popup Dialog anklickbar während die Main-GUI eingefroren bleibt oder geht das nicht? Intention: Ich hätte im Dialog gerne einen "AbbruchsButton" angebracht um die Prozesse wenn gewünscht abzubrechen. Das die Main-GUI einfriert ist aber ganz gut, sodass da keiner dran rum spielen kann.
-
Events fallen STÄNDIG an, es reicht also nicht, einmal processEvents() aufzurufen. Wie gesagt, das müsste IN die while-Schleife.
ABER: Wie ebenfalls schon gesagt arbeitet QProcess asynchron (er blockiert nicht). Mach das einfach über SIGNAL/SLOT und häng dich an das finished()-Signal deines Prozesses.