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 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_thinkers. Quando tutti _sub_thinkers 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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top