2010-09-17 61 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

相关问题