QThreads und QTimer

Alles rund um die Programmierung mit Qt
Antworten
skywalker
Beiträge: 9
Registriert: 12. April 2006 21:39

QThreads und QTimer

Beitrag von skywalker »

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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
skywalker
Beiträge: 9
Registriert: 12. April 2006 21:39

Beitrag von skywalker »

moin,

das wichtigester wäre für mich, dass meine anwendung nicht immer total weiss dargestellt wird, wenn ich den fokus davon nehme bzw. minimiere.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Dafür das processEvents(), damit die eventLoop auch alles neu zeichnen kann.
skywalker
Beiträge: 9
Registriert: 12. April 2006 21:39

Beitrag von skywalker »

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

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();
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: Alles auswählen

QApplication app(argc, argv);
	CWindowMain cmain;
	cmain.show();
	app.processEvents();
	return app.exec();
[/code]
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

skywalker hat geschrieben:das steht im konstruktor meines QWidgets
Welchem Widget?
skywalker hat geschrieben:

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();
Das Kommunizieren der Threads per Signals geht aber leider frieren halt immer die Fenster ein :-/
Das verwundert jetzt auch nicht :-)
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.
skywalker hat geschrieben:habe den processEvents Befehl hier eingefügt... ist das korrekt?
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
Beiträge: 9
Registriert: 12. April 2006 21:39

Beitrag von skywalker »

ja da haste recht, die starts habe ich schon korrigiert aber wenn ich nicht explizit run() starte dann wird der Thread nicht ausgeführt.

Warum sind die Threads in QT so umständlich?!?! Bei C# muss ich keine Klasse extra für einen Thread erzeugen :roll:
Antworten