Seite 1 von 1
In GUI status der Worker-Threads abfragen
Verfasst: 1. April 2010 18:16
von Herras
Hallo Leute, ich brauche etwas Hilfe. Ich habe eine GUI in der ich einige Threads starte und diese dann im Hintergrund arbeiten. Nun möchte ich diese Threads abfragen, ob sie sich bereits beendet haben um das Ergebnis darzustellen.
Momentan läuft es folgendermaßen:
Code: Alles auswählen
void startProcessing()
{
//Threads starten
...
while (!Thread1.isFinished())
{}
Thread2.setFinishFlag();
while (!Thread2.isFinished())
{}
resultDialog = new QDialog(this, Thread2.values);
}
Problem ist hier natürlich, dass das warten auf die Threads die GUI blockiert. Wie kann ich es am besten lösen? Mit einem Timer? Aber mir fällt nicht ein wie... Vielleicht kann mir jemand mit etwas Psudocode aushelfen?
Ach ja, am Ende wird ein Dialog mittels new erzeugt. Muss ich diesen nach dem schließen/beenden (ohne die Main GUI zu beenden) trotzdem mit delete löschen?
Danke im Voraus!
Verfasst: 1. April 2010 20:16
von Christian81
Jeder QThread emittiert z.B. ein SIGNAL finished()
Oder wenn das zu spät ist ein eigenes Signal implementieren.
Verfasst: 2. April 2010 18:42
von Herras
Die GUI hat nun einen Timer der den Threadstatus abfrägt und dann entsprechend reagiert. Funktioniert einwandfrei
Wie sieht es mit dem Dialog aus? Muss ich diesen selbst löschen oder macht er das automatisch beim schließen? Die parent GUI ist ja dann noch nicht beendet
Verfasst: 6. April 2010 12:10
von RHBaum
QT grundlagen:
kurz QT ObjectHirarchie alles was du nach dem schema px = new QXXX(pParent .... ); allokierst, also mit einem QT Object als "parent", wird von qt selber beim zerstoeren deines Parents automatisch mitgeloescht.
Bis dahin bleiben fragmente deiner QT instanz auch im speicher. So kann es z.b. sein, das wenn ein fenster geschlossen wird, die zugehoerige QWidget Impl einfach auf nicht visible gesetzt wird, aber alles komplett im speicher bleibt. und bei ner erneuten anzeige der selben Instanz das ding nur noch auf visible gesetzt wird und die werte aktualisiert.
wobei dein code oben aber eher unnüblich ist. Fuer nichtmodale Dialoge, kommen eh selten vor, nimmt man bei der qt eher anderes als QDialog.
und modale Dialoge sind meist soweiso nur kurz am leben, deswegen instanzieiert man die gleich aufn stack ...
QMyDialog diag(this);
int iresult = diag.exec();
/// ab hier braucht man den dialog meist schon nimmer .... !!!
Ciao ...
Verfasst: 5. Mai 2010 10:31
von Herras
Hallo RHBaum, danke für die ausführliche Antwort!
Momentan gebe ich dem Dialog das Attribut Qt::WA_Delete_On_Close mit, da nicht die Anwendung darüber entscheidet wann der Dialog gelöscht werden soll sondern der Benutzer. Das parent-window sollte ja trotzdem bei dessen zerstören den Dialog löschen. Ich vertraue dem Flag jetzt einfach mal...
Du meintest, ein QDialog sei eher ungeeignet für solch ein Fenster. Was würdest mir anstelle dessen empfehlen? Ich hatte mich an den Qt Beispielen orientiert, dort werden vor allem QDialoge verwendet.
Danke dir!
Gruß Herras