После посылки сигнала потоку, я ожидаю его завершения вот таким образом.
while(1)//цикл ожидания завершения работы
{
DWORD lpExitCode;
BOOL Result=GetExitCodeThread(
WorkThreadHandle, // handle to the thread
&lpExitCode // termination status
);
if(!Result)
break;
if(lpExitCode!=STILL_ACTIVE)
break;
Sleep(150);
}
Здравствуйте, Аноним, Вы писали:
А>Создаю несколько потоков и в деструкторе класса ожидаю их завершения.
А>Данный фрагмент отрабатывает в деструкторе. Для каждого потока сигналим событие и ожидаем завершения.
А>
А> DWORD size = (DWORD)m_listPool.size();
А> DbgPrintF(_T("Thread pool size: %d. \n"), size);
А> PHANDLE handles = (PHANDLE)new HANDLE[size];
А> if(!handles)
А> {
А> return;
А> }
А> for(it = m_listPool.begin(), i = 0; it != m_listPool.end(); it++, i++)
А> {
А> handles[i] = it->hThread;
А> DbgPrintF(_T("Signal %d. \n"), i);
А> SetEvent(it->hStopEvent);
А> }
А> m_csPoolGuard.Unlock();
А> DbgPrintF(_T("Before wait!!! \n"));
А> WaitForMultipleObjects(size, handles, TRUE, INFINITE);
А> DbgPrintF(_T("After wait!!! \n"));
А> m_csPoolGuard.Lock();
А> for(it = m_listPool.begin(); it != m_listPool.end(); it++)
А> {
А> if(it->hStopEvent)
А> {
А> CloseHandle(it->hStopEvent);
it->>hStopEvent = NULL;
А> }
А> if(it->hWorkEvent)
А> {
А> CloseHandle(it->hWorkEvent);
it->>hWorkEvent = NULL;
А> }
А> if(it->hThread)
А> {
А> CloseHandle(it->hThread);
it->>hThread = NULL;
А> }
А> }
А> m_listPool.erase(m_listPool.begin(), m_listPool.end());
А> m_csPoolGuard.Unlock();
А> delete [] handles;
А>
А>Функция потока получает событие и завершается.
А>
А>// it - итератор на элемент списка, содержащего хэндлы событий и потока
А>for(;;)
А> {
А> dwRes = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
А> switch(dwRes - WAIT_OBJECT_0)
А> {
А> case 0:
А> // получаем событие
А> DbgPrintF(_T("Finish. \n"));
А> goto FINISH;
А> // выполняем зачистку
А> m_csPoolGuard.Lock();
А> CloseHandle(it->hWorkEvent);
it->>hWorkEvent = NULL;
А> CloseHandle(it->hStopEvent);
it->>hStopEvent = NULL;
А> /*CloseHandle(it->hThread);
it->>hThread = NULL;*/
А> m_listPool.erase(it);
А> m_csPoolGuard.Unlock();
А>
А>Если CloseHandle(it->hThread) раскомментрировать, то WaitForMultipleObjects срабатыает тогда, когда один из потоков еще продолжает выполнениею. Если нет, мы не выходим из WaitForMultipleObjects.
А>Отладочный вывод при закомментированом CloseHandle(it->hThread) следующий:
А>Thread pool size: 3.
А>Signal 0.
А>Finish.
А>Signal 1.
А>Finish.
А>Signal 2.
А>Finish.
А>Thread quit!!!
А>Thread quit!!!
А>Thread quit!!!
А>Before wait!!!
А>Как видно, события пробудили потоки, потоки закончили выполнение, но по прежнему ждем на WaitForMultipleObjects. Из-за чего это может быть?