QtConcurrent, non-blocking call?

Alles rund um die Programmierung mit Qt
Antworten
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

QtConcurrent, non-blocking call?

Beitrag von bobcat »

Gibt es eine Möglichkeit, direkt (d.h. ohne Signal/Slot Verbindung) eine Funktion in einem anderen Thread aufzurufen, ohne dass mein aufrufender Thread an der Stelle blockiert? Ich will in etwa das folgende machen:

Code: Alles auswählen

QFuture<int> f1 = QtConcurrent::run(&someClassInstance, &SomeClass::doWork, someParameter);
f1.waitForFinished();
// oder 
int result = f1.result();
Jetzt wird SomeClass::doWork(...) zwar in einem anderen Thread ausgeführt, aber in meinem Hauptthread geht's auch erst weiter, wenn das Ergebnis von doWork vorliegt und damit waitForFinished() oder result() zurückkehren.

Üblicherweise würde man in doWork(...) ein Signal senden, wenn man fertig ist, dieses im Hauptthread wieder auffangen und dann weiterarbeiten. Das bedeutet dann auch, dass man alle Funktionen, die den obigen Codeschnipsel aufrufen, per Signal/Slot verbinden muss. Das geht, ist aber mit einem gewissen Aufwand verbunden und wie ich finde beim Lesen des Codes auch weniger transparent als ein Code, der in geschlossener Form arbeitet.

Ich meine, solch einen nicht blockierenden Aufruf wie oben beschrieben gibt's nicht. Falls ich da falsch liege, würde ich mich über eine Idee freuen, wie man's umsetzen kann.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QtConcurrent, non-blocking call?

Beitrag von Christian81 »

Was nun? Soll es blockieren oder nicht?
blockieren -> f1.waitForFinished()
nicht blockieren -> QFutureWatcher
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: QtConcurrent, non-blocking call?

Beitrag von bobcat »

Die Frage war, ob es eine nicht blockierende Möglichkeit gibt, die ohne Signal auskommt. Wenn ich den QFutureWatcher nehme, dann muss ich ja trotzdem z.B. QFutureWatcher::finished() abonnieren, um in meinem Hauptthread mit dem Ergebnis des anderen Threads weiter machen zu können.
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

Re: QtConcurrent, non-blocking call?

Beitrag von softwaremaker »

Du kannst zyklisch abfragen, ob der thread fertig ist.
Z. B. mit einem Timer alle 100 ms, blos dann brauch der wieder ein Signal/Slot.
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

Re: QtConcurrent, non-blocking call?

Beitrag von softwaremaker »

Aber was spricht gegen Signal/Slot?
Mit Lambda kannst du die Funktion direkt im ::connect() schreiben.
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: QtConcurrent, non-blocking call?

Beitrag von bobcat »

Ich finde, ein Programmablauf ist einfacher zu verstehen, wenn man den Code zeilenweise lesen kann statt sich in die bestehenden connects reinzudenken. Ich nutze Signals/Slots zwar ausgiebig und bin mir bewusst, dass das ein mächtiger Mechanismus ist. Ich hatte nur überlegt, wie man die Anzahl der connects etwas reduzieren kann, um die Umsetzung und die Lesbarkeit des Codes etwas zu vereinfachen.
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

Re: QtConcurrent, non-blocking call?

Beitrag von softwaremaker »

Na dafür ist Lambda doch perfekt, statt Zeiger auf eine SLOT-Funktion kannst du die Implementierung der Funktion direkt hinschreiben.
Antworten