Проблема состоит в следующем:
Неудается корректно завершить Thread,
функция WaitForSingleObject(m_pThread->m_hThread, INFINITE), зависает на бесконечное количество времени,
при этом трид не дохнет и не выполняется НЕ ПРОИСХОДИТ НИ ЧЕГО (прога просто зависает)
Почему это происходит?
Как решить проблему?
void CThreadTroubleDlg::OnGoThread()
{
m_pThread = AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_LOWEST);
CStatic* pText = (CStatic*)GetDlgItem(IDS_TEXT);
TRACE(_T("\nThread is started!"));
pText->SetWindowText(_T("Thread is started!"));
}
void CThreadTroubleDlg::OnStopThread()
{
m_bStopThread = TRUE;
// Вот сдесь весь геморрой и сосредеточен!
if (m_pThread != NULL) WaitForSingleObject(m_pThread->m_hThread, INFINITE);
CStatic* pText = (CStatic*)GetDlgItem(IDS_TEXT);
TRACE(_T("\nThread is dead!"));
pText->SetWindowText(_T("Thread is dead!"));
}
UINT CThreadTroubleDlg::ThreadProc(LPVOID lParam)
{
CThreadTroubleDlg* pMe = (CThreadTroubleDlg*)lParam;
CStatic* pText = (CStatic*)pMe->GetDlgItem(IDS_TEXT);
ASSERT(pText);
while(1)
{
if (pMe->m_bStopThread)
{
TRACE(_T("\nThread is stopped!\n\n"));
pText->SetWindowText(_T("Thread is stopped!"));
break;
}
else
{
TRACE(_T("\nThread is alive!"));
pText->SetWindowText(_T("Thread is alive!"));
}
}
return 0;
}
Тестовый проект можно скачать здесь:
http://allco.simtel.ru/ThreadTrouble.rar
login: rsdn
passwd: rsdn
P.S. Данный вопрос уже подымался мной пару месяцев назад, решение было найдено в вызове WaitForSingleObject(m_pThread->m_hThread, INFINITE);
в деструкторе класса (мне тогда корректное завершение требовалось при завершении процесса),
но сейчас нужно по событию его останавливать и снова пускать