asio :: io_service在破坏时挂起

时间:2010-09-17 02:59:45

标签: c++ visual-c++ boost mfc

我用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;
}

1 个答案:

答案 0 :(得分:0)

您应该能够将DllMain添加到DLL中,以便可靠地接收线程和进程级别的附加和分离通知。在进程分离中执行所需的清理。

只有我不知道是,引用ExitInstance意味着这是一个MFC应用程序,我没有在这种情况下这样做。我认为这是处理DLL特定资源的最可靠方法。

编辑:

MSDN docs意味着您应该能够覆盖ExitInstance,以便在调用基本MFC实现之前清理资源。这对你来说可行吗?