[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();
    }
}
comments powered by Disqus