QThread confusione
-
12-10-2019 - |
Domanda
sto usando Qt 4.7.0 (32 bit) il Windows 7 Ultimate (32 bit) della macchina. Sono stato utilizzando Qt probabilmente dalla versione 4.0 o 4.2 e ho usato quasi tutti i 4.x.y stampa.
guai Recentemente, con Qt 4.7 che ho affrontato.
Ho scritto un'applicazione multithread in qualche vecchia versione di Qt. Ho dimenticato la versione, ma probabilmente l'ultima versione in cui ho compilato e corse correttamente è 4.5.x o 4.6.x. Il filettata ??em> parte non sembra funzionare correttamente in 4.7, o ho capito male qualcosa. Qui è il problema:
Il thread principale inizia filo thinker
. In seguito è la funzione run()
di filo thinker
:
void ThinkerThread::run()
{
_threads_running = NSUBTHINKERS;
// ...
_sub_thinker[0].start();
// ...
_sub_thinker[1].start();
exec();
}
segnale _sub_thinker
del finished()
è collegata con la fessura ThinkerThread::subThinkerFinished()
per tutti _sub_thinker
s. Quando tutti _sub_thinker
s finiscono, ThinkerThread::subThinkerFinished()
chiama quit()
.
C'è un altro luogo dove quit()
si chiama:
void ThinkerThread::tryKill()
{
for (int i = 0; i < NSUBTHINKERS; i++)
_sub_thinker[i].tryKill();
quit();
}
Da filo principale, l'esecuzione è come il seguente:
- thinker.tryKill () [Nota:. Il run molto pugno, pensatore non era in funzione]
- thinker.start ()
segnale thinker
di finished()
è collegato con autoMove()
.
Per tutte le versioni precedenti di Qt, autoMove()
è stato chiamato dopo thinker::quit()
viene chiamato da ThinkerThread::subThinkerFinished()
. In 4.7 sto vedendo che autoMove()
è chiamato dopo il primo richiamo della thinker.tryKill()
, anche se il filo non era in funzione.
Qualche idea?
Certo che può controllare ThinkerThread::tryKill()
all'interno se thinker
è in esecuzione o meno. Ma mi piacerebbe sapere perché sta succedendo questo.
Grazie.
Soluzione
Ho trovato che QThread::finished()
viene emesso ogni volta che viene chiamato QThread::quit()
indipendentemente dallo stato di QThread
(vale a dire, in esecuzione / non in esecuzione). Non ha fatto il caso per le versioni precedenti di Qt.