Продолжение проблемы с Threads
От: allco Лес http://www.asdevel.com
Дата: 15.10.04 16:15
Оценка:
Проблема состоит в следующем:

Неудается корректно завершить 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);
в деструкторе класса (мне тогда корректное завершение требовалось при завершении процесса),
но сейчас нужно по событию его останавливать и снова пускать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.