In GUI status der Worker-Threads abfragen

Alles rund um die Programmierung mit Qt
Antworten
Herras
Beiträge: 10
Registriert: 31. März 2010 21:10

In GUI status der Worker-Threads abfragen

Beitrag 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!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Jeder QThread emittiert z.B. ein SIGNAL finished()
Oder wenn das zu spät ist ein eigenes Signal implementieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Herras
Beiträge: 10
Registriert: 31. März 2010 21:10

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Code: Alles auswählen

resultDialog = new QDialog(this, Thread2.values); 
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 ...
Herras
Beiträge: 10
Registriert: 31. März 2010 21:10

Beitrag 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
Antworten