Benutzer-Werkzeuge

Webseiten-Werkzeuge


qt_topics

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte Überarbeitung Beide Seiten der Revision
qt_topics [2014/12/27 12:29]
karl angelegt
qt_topics [2015/12/19 02:44]
karl [Worker-Threads]
Zeile 6: Zeile 6:
 http://www.qtforum.de/forum/viewtopic.php?f=1&t=16671 http://www.qtforum.de/forum/viewtopic.php?f=1&t=16671
  
 +===== Worker-Threads =====
 +[[http://doc.qt.io/qt-5/qthread.html#details|QThread]] \\
 +Wenn man eine GUI hat, in der dann rechenintensieve Routinen laufen, dann sollten diese unbedingt in einem eigenen Thread laufen!
 +
 +Grundprinzip:
 +  * Es gibt den GUI-Thread (z.B. MainWindow) und den Arbeiter-Thread. 
 +  * Innerhalb des mainWindows wird der Arbeiter-Thread mit <code>QThread workerThread; </code> angelegt. 
 +  * Weiters muss man die rechenaufwändigen Sachen in eine eigene QObject-Klasse packen, also von QObject ableiten. <code>class Worker : public QObject 
 +{
 +  ...
 +}</code> 
 +  * In der GUI wird dann zur Laufzeit ein Objekt von Worker anglegt, und dieses dann in den Thread geschoben: <code>worker = new Worker(); 
 +worker->moveToThread(&workerThread);</code>
 +  * Hat man alle Signals und Slots vom mainWindow und worker verbunden, startet man den Thread: <code>    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
 +    connect(this, MainWindow::operate, worker, &Worker::process);
 +    connect(worker, &Worker::finished, this, &MainWindow::finished);
 +    connect(worker, &Worker::currentFileNameChanged, this, &MainWindow::updateFileName);
 +    workerThread.start();</code>
 +
 +Somit läuft das Objekt nun in einem eigenen Thread, und wir mit einem 
 +  emit operate();
 +angestartet. Von dem Thread aus kann man dann ganz normal seine Signals an mainWindow schicken, und dort entsprechend die GUI updaten, z.B. einen QProgressbar. 
  
qt_topics.txt · Zuletzt geändert: 2018/03/26 00:46 von karl