Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Невалидный хендл потока в функции потока


Автор: Alca 14.12.2009, 18:32
Создаю поток методом bCreate:
Код

//---------------------------------------------------------------------------
BOOL CXThread::bCreate(const pThreadProc ptfStartAddress, VOID *pvParam) {
    HANDLE hRes = NULL;
    
    hRes = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, _s_uiStartFunc, this, 0/*not paused*/, (UINT *)&_m_ulID));
    /*DEBUG*/XASSERT_RET(NULL != hRes, FALSE);    //не срабатывает !!!

    _m_hThread = hRes;
    /*DEBUG*/XASSERT_RET(NULL != _m_hThread, FALSE);    //не срабатывает !!!
    
    return TRUE;
}
//---------------------------------------------------------------------------
/*static*/ UINT WINAPI CXThread::_s_uiStartFunc(VOID *pvParam) {
    /*DEBUG*/XASSERT_RET(NULL != pvParam, 0);

    UINT uiRes = 0;

    CXThread *pthThis = static_cast<CXThread *>(pvParam); 
    /*DEBUG*/XASSERT_RET(NULL != pthThis, 0);                //не срабатывает !!!
    /*DEBUG*/XASSERT(NULL != pthThis->_m_hThread);          //!!! иногда срабатывает

    //...
    
    return uiRes;
}
//---------------------------------------------------------------------------

Почему иногда срабатывает эссерт?
Код

/*DEBUG*/XASSERT(NULL != pthThis->_m_hThread); 

Автор: GremlinProg 14.12.2009, 19:09
потому что _m_hThread = hRes; может выполниться как раньше XASSERT(NULL != pthThis->_m_hThread), так и позже ( так и между )) ), это ведь уже другой поток

если нужно сделать какую-нить инициализацию - приостанови его при создании (флаг CREATE_SUSPENDED), сделай все что надо и продолжи (ResumeThread)

или передавай событие в функцию потока, и спускай курок после инициализации (я приводил пример такого барьера, при передаче параметров в поток через va_list, смотри поиск)

Автор: Alca 14.12.2009, 19:15
GremlinProg, спасибо.

Автор: Alca 14.12.2009, 22:15
FAQ: http://forum.vingrad.ru/forum/topic-257041/view-all/hl/va_list/index.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)