Seite 1 von 1

QThread für lange Berechnung

Verfasst: 17. Juli 2007 20:06
von Eddie
Hallo zusammen,

ich habe eine langwierige Berechnung, die zweimal mit jeweils unterschiedlichen unabhängigen Daten ausgeführt werden muss. Ich dachte, die Berechnung kann man auf einem Dual-Core-Rechner gut in eine QThread-Klasse packen und diese dann zweimal aufrufen, so dass beide Datensätze gleichzeitig abgearbeitet werden. Nach dem Start der beiden Threads möchte ich in der Hauptanwendung auf das Ende beider Threads warten und dann soll es mit der Verarbeitung beider Ergebnisse weiter gehen.

Mein Versuch:
in der Hauptanwendung:

Code: Alles auswählen

SPromtKBBTransformThread *pTransformThread1, *pTransformThread2;
pTransformThread1 = new SPromtKBBTransformThread();
pTransformThread1->init( /* Daten übergeben */);
pTransformThread2 = new SPromtKBBTransformThread();
pTransformThread2->init( /* andere Daten übergeben */ );

pTransformThread1->start();
pTransformThread2->start();
pTransformThread1->wait();
pTransformThread2->wait();

// Ergebnisse beider Threads weiter verarbeiten
der Thread selbst:

Code: Alles auswählen

void SPromtKBBTransformThread::run(void)
{
// ohne while-Schleife: ganz viel rechnen
}
Mein Problem:
- Manchmal melden beide Threads, dass sie gestartet wurden - manchmal meldet sich der 2. Thread nicht.
- keiner der Threads kommt an sein Ende (werden sie evtl. durch wait() beendet?)

Mache ich grundsätzlich etwas falsch?
Ich bin für jede Hilfe dankbar.

Ed

Verfasst: 17. Juli 2007 20:19
von upsala
Mit wait() ohne Parameter wartest du die nächsten 1000 Jahre noch. Siehe Doku. QThread hat das Signal finished(). 'Warte' auf dieses.

Verfasst: 18. Juli 2007 09:23
von Eddie
In der Doku steht nichts von einem Signal finished(). Kann es daran liegen, dass ich mit Qt 3 arbeite?

Die Doku zu wait(), habe ich so verstanden, dass so lange gewartet wird, bis run() verlassen wurde - die Berechnung also beendet ist.

Verfasst: 18. Juli 2007 12:19
von upsala
Bei Qt3 kann ich nicht mitreden.

[gelöst] QThread für lange Berechnung

Verfasst: 19. Juli 2007 19:58
von Eddie
Habe das Problem gelöst. Schuld waren meine Ausgaben in eine Nachrichtenfenster der GUI. Das hat wohl gehakt.

Ansonsten geht das mit dem wait, nur, dass es die GUI blockiert bis beide Threads fertig sind.

Verfasst: 19. Juli 2007 21:59
von iaby
Bei den Ausgaben in das GUI wirst du wohl CriticalSections bemühen müssen! Zumindest ist das bei Delphi so!
Und damit dein GUI nicht hängt bleibt einem wohl nichts anderes übrig als das wait() wegzulassen und dafür Signals/Slots zu benutzen.