Здравствуйте, 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