как правильно создать и закончить тред (thread) в WinAPI?
От: ksd Россия  
Дата: 03.02.17 12:27
Оценка:
Казалось бы все просто и понятно, а вот что имеем:

// DLL
HANDLE h[2];

void __cdecl ThreadProc(void*)
{
    SetEvent(h[0]);
}

BOOL APIENTRY DllMain(
    IN HMODULE moduleHandle,
    IN DWORD reasonForCall,
    IN LPVOID pReserved)
{
    switch (reasonForCall)
    {
        case DLL_PROCESS_ATTACH:
        {
            h[0] = CreateEvent(0,0,0,0);
            h[1] = (HANDLE)_beginthread(ThreadProc,0,0);
        }
        break;
        case DLL_PROCESS_DETACH:
        {
            WaitForMultipleObjects(2, h, FALSE, INFINITE); // виснет здесь
        }
    }
    return TRUE;
}


// тест
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE h = LoadLibrary(_T("dll.dll"));
    FreeLibrary(h);
    return 0;
}


Дело в том, что LoadLibrary и FreeLibrary выполняются так, что не успевает зайти в ThreadProc, поэтому на FreeLibrary висим. Более того, понимаю, что хэндл треда ждать в DllMain вообще бесполезно, но пусть будет (это из реальной функции ожидания завершения треда для общего случая).

Научите, пожалуйста, если не сложно и найдется время, как правильно запускать и останавливать треды! У меня иначе как используя 2 евента и 2 раза принудительно переключаясь не получается
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.