Seite 1 von 1

QProgressDialog und QtConcurrent::run

Verfasst: 13. November 2014 02:05
von DimitriJunker
Hallo,

Sagen wir ich will 100 Bilder erzeugen in 4 Threads und den Fortschritt per QProgressdialog darstellen, wie muß ich das machen. Gefunden habe ich nur Beispiele mit QTConcurrent::map, aber das wäre ja wohl eher etwas wenn ich 100 Bilder in 100 Threads starten will, Außerdem wird bei dem Bsp soweit ich es verstanden habe als Fortschritt der Abschluß jeweils eines Threads angezeigt. Ich will aber aus den Threads heraus das Label und den Value verändern.

Gruß
Dimitri

Re: QProgressDialog und QtConcurrent::run

Verfasst: 13. November 2014 06:45
von Christian81
Wenn ein Bild fertig ist, aus dem Thread heraus ein Signal senden und dieses auswerten um den ProgressDialog zu aktualisieren.

Re: QProgressDialog und QtConcurrent::run

Verfasst: 14. November 2014 03:02
von DimitriJunker
Ja soweit war ich auch schon, aber wie ich das machen soll ist mir noch nicht klar.
In den Threads erzeuge ich mit emit ein Signal. Im Hauptthread habe ich einen Slot, aber dann braucht man ja noch die Verbindung. Dazu dient ja connect, aber erstens wo kommt das connect hin und zweitens :
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]

was trage ich als Sender ein? mit QTConcurrent::run rufe ich doch eine externe Funktion auf, die ist also kein QObject. Genauer: der Aufruf sieht so aus:

Code: Alles auswählen

void MainW::makePmap()
{
         ...
         for(int threadNr=0;threadNr<data->m_maxThreads;threadNr++)
             QtConcurrent::run(loadPMapInThread,data);
         ...
}
Und die Funktion:

Code: Alles auswählen

void loadPMapInThread( SDLM_DATA * data )
{
...
}
Danke im vorraus
Dimitri

Re: QProgressDialog und QtConcurrent::run

Verfasst: 20. November 2014 13:06
von DimitriJunker
Hallo,

nach langer Suche und einer parallelen Frage im englischen Forum habe ich von QtConcurent::run auf QtConcurent::map umgestellt, dazu gibt es Beispiele wie man es mit QProgressDialog verknüpft. Was mich zuerst davon abhielt war, daß ich davon ausging, daß genau so viel Threads parralel laufen wie es Elemente zu bearbeiten gibt. Dies ist aber nicht der Fall, normalerweise läuft je ein thread pro Kern, dies kann aber auch mit
QThreadPool::globalInstance()->setThreadCount()

auf einen anderen Wert geändert werden.