qt thread mit movetothread
Ich versuche, erstellen Sie ein Programm mit threads:
die wichtigsten beginnen mit einer Schleife.
Wenn ein test den Wert true zurück, erstelle ich ein Objekt und ich möchte, dass Objekt zum arbeiten in einen anderen thread
dann zurück und starten Sie den test .
QCoreApplication a(argc, argv);
while(true){
Cmd cmd;
cmd =db->select(cmd);
if(cmd.isNull()){
sleep(2);
continue ;
}
QThread *thread = new QThread( );
process *class= new process ();
class->moveToThread(thread);
thread->start();
qDebug() << " msg"; //this doesn't run until class finish it's work
}
return a.exec();
das problem ist, wenn ich beginne den neuen thread der Haupt-thread beendet und warten auf den neuen thread fertig stellen .
InformationsquelleAutor unfamous | 2012-06-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den kanonischen Qt Weg würde wie folgt Aussehen:
im Falle Sie nicht vertraut mit den Signalen/slots, die Task-Klasse würde wie folgt Aussehen:
Sie müssen erstellen die Kinder aus der
Task
code, der läuft bereits in der Ziel-thread, oder vor dem Objekt bewegt wird, um die Ziel-thread.smerlin: ein dickes Lob für eine sehr nette Antwort.
Ich Frage mich, was ist zu tun, wenn Sie möchten, senden Parameter zur doWork()? Könnten Sie senden Sie die Parameter direkt oder würden Sie haben zu liefern, die Sie auf eine andere Weise. Dann vielleicht mit Hilfe von events besser werden würde.
Entweder Sie übergeben die Parameter an die Task-Konstruktor und speichern Sie Sie als member-Variablen, oder verwenden Sie die signal/slot-system.
InformationsquelleAutor smerlin
Ich weiß nicht, wie Sie strukturiert Ihre Prozess-Klasse, aber das ist nicht wirklich die Art und Weise, dass moveToThread funktioniert. Die moveToThread Funktion sagt QT, dass alle slots ausgeführt werden müssen, in den neuen thread, anstatt im thread wurden Sie signalisiert aus. (edit: Tatsächlich, ich erinnere ist es standardmäßig der Lauffläche das Objekt erstellt wurde)
Auch, wenn Sie die Arbeit in Ihren process-Klasse aus dem Konstruktor wird nicht ausgeführt, in den neuen thread.
Der einfachste Weg, um Ihre Prozess-Klasse auszuführen, in einem neuen thread zum ableiten von QThread und überschreiben der run-Methode. Dann müssen Sie nie Anruf verschieben thread überhaupt.
Es funktioniert nur so, wenn Sie wollen nie irgendwelche Signale noch slots in Ihre worker-Codes. Sobald Sie das tun, ist es einfacher, abgeleitet von QObject. Normalerweise werden Sie wollen, haben mehrere Arbeiter QObjects pro thread. Die übliche Art und Weise und erzeugt einen thread pro Aufgabe erledigt ist, naja, braindead. Sie fügt hinzu, thread-switching-overhead, wo keiner benötigt wird.
Sie betrügen kann, und leiten sich von QThread und fügen Sie Signale und slots, um es, aber es wird wirklich unintuitiv. Ein QThread ist ein Objekt, das einen thread steuert. Beim ausführen von QThread ist slots innerhalb der thread selbst, Sie erstellen ein Frankenstein, ein thread-controller und einen Faden. Und, wieder, es wird ein single-purpose-thread.
Der einzige Grund, warum die Ableitung von QThread ist... naja, es gibt keinen Grund. QThread spins eine Ereignis-Schleife, und Sie können immer ein QObject ist. Damit ist Ihre worker-Objekts Lebensdauer ist nicht die gleiche wie die Lebensdauer des Fadens. Warum nicht wieder den thread wenn es mehr Arbeit zu tun? Und so weiter... der Qt-Dokumentation völlig den Punkt verpasst, zu erklären, dies alles 🙁
Es war einmal ein Grund... once upon a time
QThread
wurde eine abstrakte Klasse, und Sie hatte, um abzuleiten und zu implementierenrun()
- und call -exec()
sich... aber auch gut, dassQThread
bietet nun eine Umsetzung derrun()
selbst.InformationsquelleAutor jlunavtgrad