[QT] KillTimer Warning
문제 현상
- QT5에서 동작 시 문제 발생 (QT4에서는 문제 발생하지 않았음)
QObject::killTimer: Timers cannot be stopped from another thread
문제 원인
- MainWindow에서 소멸자가 불려 mManagerThread가 종료가 된 후에, mManager를 delete함
MainWindow::~MainWindow()
{
mManagerThread.quit();
if(!mManagerThread.wait(3000)) //Wait until it actually has terminated (max. 3 sec)
{
mManagerThread.terminate(); //Thread didn't exit in time, probably deadlocked, terminate it!
mManagerThread.wait(); //We have to wait again here!
}
... (생략) ...
delete mManager;
mManager가 종료되어 소멸자가 불리면, 쓰레드가 이미 종료된 상태이기 때문에 Manager 소멸자에서 QTimer를 stop할려고 할때 위와 같은 문제가 발생함
다른 Thread에서 Timer를 stop 시킬려고 해서 생기는 문제였음
CManager::~CManager()
{
QMap<int, IAgent*>::iterator i;
for (i = mAgents.begin(); i != mAgents.end(); ++i) {
delete i.value();
}
}
해결책
- finished signal을 활성화 시켜 종료시 event를 emit할때 delete를 수행하도록 변경함
connect(&mManagerThread, SIGNAL(finished()), mManager, SLOT(onTerminated()));
void CManager::onTerminated()
{
QMap<int, IAgent*>::iterator i;
for (i = mAgents.begin(); i != mAgents.end(); ++i) {
delete i.value();
}
}