У меня есть таймер с надстройкой (144 -> новейшая библиотека).
Этот таймер запускается в потоке Boos. Таймер также запускает поток
в котором io_service размещает таймер крайнего срока до завершения потока.
так непрерывный таймер.
Повышающий поток, которому нужен таймер, создается из DLL.
Функция DLL ExitInstance вызывается при размещении приложения. разгружается
DLL. Функция ExitInstance останавливает поток и до таймера.
Но уничтожение io_service в моем таймере никогда не возвращается, поэтому приложение зависает.
Это происходит НЕ, когда я могу вызвать функцию Dispose до вызова ExitInstance. Однако некоторые приложения, загружающие мою DLL, не дают возможности вызывать эту функцию.
Кто-нибудь знает, как обойти эту проблему?
Вот код моего ядра таймера. Это поток, который перезапускает службу
пока поток не остановлен. Поток get останавливается установкой флага _stop и
установка таймера мертвой точки на 1 мс в будущем.
Summary: виснет, когда внутри 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;
}