asio :: io_service висит на уничтожение - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть таймер с надстройкой (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;
}

1 Ответ

0 голосов
/ 19 сентября 2010

Вы должны иметь возможность добавить DllMain в свою DLL, чтобы надежно получать уведомления о присоединении и отсоединении на уровне потоков и процессов. Выполните необходимую очистку в процессе отсоединения.

Единственное, что мне неизвестно, это то, что ссылка на ExitInstance подразумевает, что это приложение MFC, и я не делал этого в этом сценарии. Я думаю, что это самый надежный способ обработки специфичных для DLL ресурсов.

EDIT:

Документы MSDN подразумевают, что вы должны иметь возможность переопределить ExitInstance, чтобы вы могли очистить свои ресурсы до вызова базовой реализации MFC. это возможно для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...