Re: WaitForMultipleObjects не возвращает управление
От: ovl123 Россия  
Дата: 20.05.08 07:52
Оценка:
После посылки сигнала потоку, я ожидаю его завершения вот таким образом.

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. Из-за чего это может быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.