у меня чем то похожая загвоздка, правда не совсем. Короче, ситуация такая:
имеется глобальное событие , которое задумано использоваться для сообщения потоку о том, что надо бы завершиться.
HANDLE event=::CreateEvent(0,1,0,0);
запускаю поток, так:
::AfxBeginThread(thread1,event);
в качестве параметра передаю хендл на событие, событие в этот момент сброшено, поток такой:
//поток для постоянного чтения сообщений
UINT thread1(LPVOID param)
{
HANDLE event=(HANDLE)param;
for(;;)
{
Sleep(1000);
//смотрим, не надо ли выйти
::AfxMessageBox("проверка на выход из потока",MB_SYSTEMMODAL);
if(WAIT_OBJECT_0==::WaitForSingleObject(event,0))
{
::AfxMessageBox("выход из потока",MB_SYSTEMMODAL);
break;
}
}
return 0;
}
по нажатию на кнопку завершаю поток выставлением события, для эксперимента делаю так:
Sleep(5000);
::SetEvent(event);
Sleep(5000);
::AfxMessageBox("10 сек после нажатия прошло",MB_SYSTEMMODAL);
запускаю программу, появляется сообщение о запуске потока, затем в потоке, как и ожидается, раз в секунду появляется окно с сообщением (проверка на выход из потока).
Жму на кнопку - зависает всё , и основной процесс (ну это вроде так и должно быть) и ПОТОК (?) , потому что во время слипа 5 секунд окошко в диалоге не выскакивает, потом , когда выставляется событие, ждётся ещё 5 секунд - по истечении всех 10 секунд выясняется, что поток всё это время так и висел, ибо после этого он благополучно сообщает -
"проверка на выход из потока",
"выход из потока",
что я не правильно делаю? Или так нельзя делать ?