Re: Завершение потока при завершении приложения
От: Don Sergio  
Дата: 25.07.03 07:09
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Есть поток — создаваемый AfxBeginThread() (рабочий поток)

Doc>Внутри его функции идет вывов функции void Func(x), которая работает с памятью
Doc>(в начале выделяет ее себе, а потом освобождает).
Doc>Все это повторяется несколько циклов после чего поток завершается и класс самоуничтожается.

Doc>Если же завершить приложение во время работы потока — получаем memory leak.

Doc>Вопрос — как завершается поток при завершении приложения (каким способом)?
Doc>Как отследать в потоке завершение приложения (что бы сначало высвободить ресурсы).
Doc>(хм... как я понимаю он прерывается в любом месте.)

Doc>И как определить — является ли ссылка указателем на существующий класс потока

Doc>или он уже к даннному времени уничтожен.

Есть замечательная функция
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);

Она ждет какого-нибудь объекта.
В твоем случае при завершении программы следует проверять работает ли еще поток и, если работает, вызвать эту функцию, которая будет ждать пока поток не завершит работу.
Пример

// предположим, что где-то было написано CWinThread *m_Thread = ::AfxBeginThread(.....)
// m_Thread необходимо хранить


// здесь можно установить какой-нибудь глобальный флаг, кот. сообщит потоку, что пора бы и остановиться (а в потоке
//проверять состояние этого флага).
if (::WaitForSingleObject(m_Thread->m_hThread, INFINITE) == WAIT_FAILED) // ждем пока остановится
{
// если ошибка, то идем сюда.
DWORD exCode;

if (::GetExitCodeThread(m_Thread->m_hThread, &exCode))
{
if (exCode != 1)
}
}
}

}
// m_Thread явно уничтожать не надо.

А ссылку наверное можно проверить с помощью проверки значения m_Thread->m_hThread или самого m_Thread


Вот.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.