Hi.
Ich habe einen QProgressBar Dialog, der mir den Forschritt einer sehr rechenintensiven Funktion darstellt.
ich habe nun 2 threads gemacht. DialogThread und OpenFileThread.
Das Problem ist, wenn OpeNFileThread ausgeführt wird, dann kann ich zwar mit Signals den DialogThread kontaktieren aber wirklich laufen tut der Thread noch nicht (kein run ausgeführt).
Eigentlich hätte ich gerne im DialogThread einen Timer laufen, der mir das Fenster jede Sekunde aktualisiert.
Wie kann ich nun die beiden Threads parallel ausführen lassen?
QThreads und QTimer
Keine Ahnung was Du da machst, aber wenn es dir nur um eine Fortschrittsanzeige geht, dann brauchst Du keine Threads. Nimm deinen Progressbardialog und schreib die komplette Funktion da mit rein. Aktualisiere deine Anzeige regelmäßig und führe danach ein qApp->processEvents() aus. Das ist wichtig für den Fall, das der User während der Ausführung die Applikation wechselt.
Willst Du jedoch mit deiner App weiter arbeiten können, dann ist ein Thread das Mittel der Wahl.
Willst Du jedoch mit deiner App weiter arbeiten können, dann ist ein Thread das Mittel der Wahl.
Hm, funktioniert leider nicht bzw. hat keine Auswirkung.
Mein Problem:
ich habe ein QWidget, das 2 Threads hat.
1.Thread = DialogThread mit QProgressDialog
2.Thread = OpenFileThread (öffnet Datei und führt Berechnungen aus)
das steht im konstruktor meines QWidgets
Das Kommunizieren der Threads per Signals geht aber leider frieren halt immer die Fenster ein :-/
habe den processEvents Befehl hier eingefügt... ist das korrekt?
[/code]
Mein Problem:
ich habe ein QWidget, das 2 Threads hat.
1.Thread = DialogThread mit QProgressDialog
2.Thread = OpenFileThread (öffnet Datei und führt Berechnungen aus)
das steht im konstruktor meines QWidgets
Code: Alles auswählen
//launch threads
dlgThread = new DialogThread(this, parent, sFileName.c_str());
openThread = new OpeningThread(this, ....);
connect(openThread, SIGNAL(m_update(int)), dlgThread, SLOT(updateDialog(int)));
timer1.start(50,this);
openThread->start(QThread::NormalPriority);
openThread->run();
dlgThread->start();
dlgThread->run();
habe den processEvents Befehl hier eingefügt... ist das korrekt?
Code: Alles auswählen
QApplication app(argc, argv);
CWindowMain cmain;
cmain.show();
app.processEvents();
return app.exec();
Welchem Widget?skywalker hat geschrieben:das steht im konstruktor meines QWidgets
Das verwundert jetzt auch nichtskywalker hat geschrieben:Das Kommunizieren der Threads per Signals geht aber leider frieren halt immer die Fenster ein :-/Code: Alles auswählen
//launch threads dlgThread = new DialogThread(this, parent, sFileName.c_str()); openThread = new OpeningThread(this, ....); connect(openThread, SIGNAL(m_update(int)), dlgThread, SLOT(updateDialog(int))); timer1.start(50,this); openThread->start(QThread::NormalPriority); openThread->run(); dlgThread->start(); dlgThread->run();
Du startest den ersten Thread mit start(), wodurch die run()-Methode des Threads aufgerufen wird. Danach rufst Du selbst die run()-Methode auf, die halt sehr lange dauert, wie Du schon sagtest. Du startest deinen DialogThread also erst, wenn der openThread schon zuende ist. Lass die beiden run() mal weg, dann klappt das vielleicht schon.
Nein. app.exec() startet die eventLoop der Application und die ruft die einzelnen Funktionen deines Programms auf. Wenn eine Funktion sehr lange läuft, dann sollte man zwischendurch mal wieder die Kontrolle an die eventLoop abgeben, damit Signale und Messages abgearbeitet werden können. Und das mach processEvents().skywalker hat geschrieben:habe den processEvents Befehl hier eingefügt... ist das korrekt?