QThread путаница - PullRequest
       5

QThread путаница

0 голосов
/ 21 декабря 2010

Я использую Qt 4.7.0 (32 бита) на Windows 7 Ultimate (32 бита) машина. Я использую Qt, вероятно, из версии 4.0 или 4.2, и я использовал почти все 4.x.y релизы.

Недавно с Qt 4.7 я столкнулся с проблемой.

Я написал многопоточное приложение в какой-то более старой версии Qt. Я забыл версию, но, вероятно, последняя версия, где я правильно скомпилировал и запустил, - это 4.5.x или 4.6.x. Часть с резьбой не работает должным образом в 4.7, или я что-то неправильно понял. Вот проблема:

Основная нить начинает thinker нить. Ниже приводится функция run() потока thinker:

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

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

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

    exec();
}

Сигнал _sub_thinker finished() связан со слотом ThinkerThread::subThinkerFinished() для всех _sub_thinker с. Когда все _sub_thinker s заканчиваются, ThinkerThread::subThinkerFinished() вызывает quit().

Есть еще одно место, где quit() называется:

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

Из основного потока выполнение выглядит следующим образом:

  • thinker.tryKill () [Примечание: на очень первом этапе мыслитель не работал.]
  • thinker.start ()

thinker s finished() сигнал связан с autoMove().

Для всех предыдущих версий Qt, autoMove() вызывался после thinker::quit() из ThinkerThread::subThinkerFinished(). В 4.7 я вижу, что autoMove() вызывается после самого первого вызова thinker.tryKill(), хотя поток не работал.

Есть идеи?

Конечно, я могу проверить внутри ThinkerThread::tryKill(), работает thinker или нет. Но я хотел бы знать, почему это происходит.

Спасибо.

1 Ответ

0 голосов
/ 24 декабря 2010

Я обнаружил, что QThread::finished() испускается каждый раз, когда QThread::quit() вызывается независимо от состояния QThread (т.е. работает / не работает).Это не относится к предыдущим версиям Qt.

...