Pregunta

Estoy usando Qt 4.7.0 (32 bits) en Windows 7 Ultimate (32 bits) máquina. He estado usando Qt probablemente a partir de la versión 4.0 o 4.2 y he utilizado casi todos 4.x.y comunicados.

problemas Recientemente, con Qt 4.7 me he enfrentado.

He escrito una aplicación multiproceso de alguna versión anterior de Qt. Me he olvidado de la versión, pero probablemente la última versión en la que he realizado y corrió correctamente es 4.5.x o 4.6.x. El roscado parte no parece estar funcionando correctamente en 4.7, o no he entendido algo. Aquí está el problema:

El hilo principal comienza hilo thinker. A continuación se presenta la función run() de hilo thinker:

void ThinkerThread::run()
{
    _threads_running = NSUBTHINKERS;

    // ...
    _sub_thinker[0].start();

    // ...    
    _sub_thinker[1].start();

    exec();
}

señal _sub_thinker de la finished() está conectado con la ranura ThinkerThread::subThinkerFinished() para todos los _sub_thinkers. Cuando todos terminen _sub_thinkers, ThinkerThread::subThinkerFinished() llama quit().

Hay otro lugar donde quit() se llama:

void ThinkerThread::tryKill()
{
    for (int i = 0; i < NSUBTHINKERS; i++)
        _sub_thinker[i].tryKill();
    quit();
}

Desde hilo principal, la ejecución es como la siguiente:

  • thinker.tryKill () [Nota:. El plazo muy puño, pensador no estaba funcionando]
  • thinker.start ()

señal thinker de finished() está conectado con autoMove().

Para todas las versiones anteriores de Qt, autoMove() fue llamado después thinker::quit() se llama desde ThinkerThread::subThinkerFinished(). En 4.7 Estoy viendo que autoMove() se llama después de la primera llamada de thinker.tryKill(), a pesar de que el hilo no estaba funcionando.

¿Alguna idea?

Por supuesto que puede comprobar ThinkerThread::tryKill() interior si thinker está funcionando o no. Pero me gustaría saber por qué sucede esto.

Gracias.

¿Fue útil?

Solución

He encontrado que QThread::finished() se emite cada vez que se llama QThread::quit() independientemente del estado de QThread (es decir, Funcionamiento sí / no). No fue así en el caso de las versiones anteriores de Qt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top