Я использую 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
или нет. Но я хотел бы знать, почему это происходит.
Спасибо.