Завершение работы потока
Возникла трудность в реализации корректного завершения потока.
код потока выглядит примерно так:
int ThreadFnct(void)
{
while(!flagExit){
//код
}
return 0;
}
Изначально flagExit=0.
по нажатию кнопки примерно должно следующее происходить:
void CWind::OnLT()
{
Shell_NotifyIcon(NIM_DELETE, &icData);
flagExit=1
WaitForSingleObject(m_hThread, INFINITE);
EndDialog(IDCANCEL);
}
Но при выполнении WaitForSingleObject программа зависает.
т.е. не происходит выход из функции потока (такое ощущение, что все потоки программы замораживаются, включая главный).
Такую реализацию нашел на forum.sources.ru/index.php?showtopic=142494
Заранее благодарен за советы.
Насколько я помаю функция Sleep(ms) замораживает только тот поток в котором она была вызвана. Но в моем случае почему-то останавливается ВСЯ программа.
Насколько я помаю функция Sleep(ms) замораживает только тот поток в котором она была вызвана. Но в моем случае почему-то останавливается ВСЯ программа.
А это как определил, что вся?
После вызова WaitForSingleObject почему-то замораживается абсолютно всё.
Функция WaitForSingleObject вызывается в главном потоке программы.
(Работал с отладчиком Visual Studio 2003, ставил breakpoint'ы внутри дочернего потока и основного. После вызова WaitForSingleObject не один breakpoint не срабатывает).
По поводу Sleep(ms):
В дочернем потоке при каждой итерации выводил что-то типа AfxMessageBox(_T("hello")); (одна итерация длится порядка 5 секунд). Sleep(ms) вызвал в основном потоке с параметром 15000 (Sleep(15000)). По идее окошко с надписью "hello" за это время должно минимум раза два появиться с интервалом в 5 сек, а программа зависла на 15 сек. :(
что внутри
//код
}
while(!flagExit){
AfxMessageBox(_T("hello")); //это для проверки sleep
//далее идет опрос оборудования, занимает порядка 5 сек.
}
Возникла трудность в реализации корректного завершения потока.
код потока выглядит примерно так:
int ThreadFnct(void)
{
while(!flagExit){
//код
}
return 0;
}
Изначально flagExit=0.
по нажатию кнопки примерно должно следующее происходить:
void CWind::OnLT()
{
Shell_NotifyIcon(NIM_DELETE, &icData);
flagExit=1
WaitForSingleObject(m_hThread, INFINITE);
EndDialog(IDCANCEL);
}
Но при выполнении WaitForSingleObject программа зависает.
т.е. не происходит выход из функции потока (такое ощущение, что все потоки программы замораживаются, включая главный).
Такую реализацию нашел на forum.sources.ru/index.php?showtopic=142494
Заранее благодарен за советы.
Проверьте правильность параметра m_hThread. Есть ли еще какой-нибудь код в ThreadFnct после цикла? Ситуация скорее всего следующая: flagExit устанавливается в 1, цикл в ThreadFnct благополучно завершается. И вот здесь - либо вы ожидаете не тот объект, либо тот, но в ThreadFnct есть еще какой-то бесконечный цикл после первого цикла. Все это и создает иллюзию, что висят оба потока. Попробуйте поочередно (не две одновременно) поставить точки останова в дочернем и родительском потоке и посмотреть что происходит.
while(!flagExit){
AfxMessageBox(_T("hello")); //это для проверки sleep
//далее идет опрос оборудования, занимает порядка 5 сек.
}
Вполне может статься что вызов AfxMessageBox синхронизирован с основным потоком. Тут точно не скажу - это документацию надо читать, но я бы использовал MessageBeep() какой-нибудь, а ни в коем случае не окна
Буду пытаться!!!
получилось. :)
Большое всем спасибо!!!
Вся проблема была в том, что перед завершением, поток отправлял главному окну сообщение. А так как основной поток программы был занял Sleep'ом или WaitForSingleObject, то соответственно это сообщение ни как не обрабатывалось и прога висла. Очень помогла статья "Возможности встроенного отладчика Visual C++" с rsdn'а.
Всем удачи ;)))