我用boost(144 - >最新的lib)实现了计时器。 此计时器在boost线程内启动。计时器也启动一个线程 其中io_service承载截止时间计时器,直到线程终止。 所以连续计时器。 需要计时器的boost线程是在DLL中创建的。
在托管应用程序时调用DLL ExitInstance函数。卸载 DLL。 ExitInstance函数在计时器之前停止线程。 但是我的计时器中的io_service销毁永远不会返回,因此应用程序会挂起。
当我能够在调用ExitInstance之前调用Dispose函数时,会发生这种情况。但是,一些应用程序加载我的DLL,没有机会调用这个曝光函数。
任何人都知道,如何解决这个问题?
这是我的计时器核心的代码。它是重新启动服务的线程 直到线程停止。通过设置_stop标志来停止线程 将deadlime定时器设置为1 ms。 摘要:在Dll :: ExitInstance中销毁时挂起。如果在Dll :: ExitInstance之前被摧毁,则不挂起 谢谢
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;
}