2010-09-17 131 views
0

我有計時器實施與增壓(144 - >最新的lib)。 這個計時器是在一個噓聲線程內啓動的。定時器還啓動一個線程 ,其中一個io_service主持截止計時器,直到線程終止。 這樣一個連續的計時器。 需要定時器的boost線程是從DLL中創建的。asio :: io_service掛在破壞

當宿主應用程序調用DLL ExitInstance函數時。卸載 該DLL。 ExitInstance函數停止線程和定時器之前。 但我的計時器中的io_service銷燬永遠不會返回,所以應用程序掛起。

這種情況不是,當我能夠調用ExitInstance之前調用Dispose函數。但是,有些應用程序正在加載我的DLL,因此沒有機會調用此公開函數。

任何人都知道,如何解決這個問題?

這是我的計時器核心代碼。它是在線程停止前重新啓動服務 的線程。通過設置_stop標誌和 將死亡定時器設置爲1毫秒,線程得到停止。 摘要:在Dll :: ExitInstance被破壞時掛起。不掛起,如果DLL的:: ExitInstance中 之前destrcuted謝謝

void tcTimerThread::timerLoop(void) 
{ 
     _running=true; 

     /// create asynch service 
     _io_service = new boost::asio::io_service; 

     /// create timer 
     _pTimer = new boost::asio::deadline_timer(*_io_service); 
     while(_stop==false) 
     { 
      _pTimer->expires_from_now(boost::posix_time::milliseconds(_delay));    
      /// bind timer event function 
      _pTimer->async_wait(boost::bind(&tcTimerThread::timerEvent,this,boost::asio::placeholders::error));  
      try 
      { 
       if(_stop==false) 
       { 
        /// reset async 
        _io_service->reset(); 
        /// wait for timer event 
        _io_service->run(); 
       } 
      } 
      catch(...) 
      { 
      } 
     } 
     try 
     { 
      _io_service->stop(); 
      delete _pTimer; 
      delete _io_service; 
     } 
     catch(...) 
     { 
     } 
     _running=false; 
} 
+0

將調試器附加到掛起的應用程序時,回溯是什麼樣的? – 2010-09-19 22:13:27

回答

0

您應該能夠添加DllMain到您的DLL,以可靠地接收的thread-通知和流程級別的連接和分離。在進程分離中執行所需的清理。

我唯一不知道的是,指向ExitInstance的參考意味着這是一個MFC應用程序,我沒有在這種情況下做到這一點。我認爲這是處理DLL特定資源的最可靠的方法。

編輯:

MSDN docs意味着你應該能夠覆蓋ExitInstance中,這樣就可以清理你的資源基礎MFC實現之前調用。這對你是否可行?

+0

你好,謝謝你的回答。 – user450195 2010-09-20 12:04:39

+0

好吧,我可以將文件DLL模塊添加到我的項目中,並將其更改爲在PROCESS_DETACH的情況下調用某些內容。但看着代碼,我看到從PROCESS_DETACH直接調用靜態鏈接的MFC ExitInstance。所以我想這是沒有解決方案。我懷疑有一些基本的過程資源已經清理,所以asio服務「困惑」..? – user450195 2010-09-20 12:08:09

+0

參見編輯 - 這可能嗎? – 2010-09-20 14:49:16