Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Завершение работы потока

4.8K
02 сентября 2008 года
fakel15
54 / / 02.12.2005
Здравствуйте!
Возникла трудность в реализации корректного завершения потока.
код потока выглядит примерно так:

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

Заранее благодарен за советы.
4.8K
02 сентября 2008 года
fakel15
54 / / 02.12.2005
И ещё один интересный момент.
Насколько я помаю функция Sleep(ms) замораживает только тот поток в котором она была вызвана. Но в моем случае почему-то останавливается ВСЯ программа.
240
02 сентября 2008 года
aks
2.5K / / 14.07.2006
А поверял, из цикла то выходит то поток? И в каком потоке вызывается WaitForSingleObject?

Цитата: fakel15
И ещё один интересный момент.
Насколько я помаю функция Sleep(ms) замораживает только тот поток в котором она была вызвана. Но в моем случае почему-то останавливается ВСЯ программа.


А это как определил, что вся?

4.8K
02 сентября 2008 года
fakel15
54 / / 02.12.2005
Вот именно, что поток из цикла не выходит!
После вызова WaitForSingleObject почему-то замораживается абсолютно всё.
Функция WaitForSingleObject вызывается в главном потоке программы.
(Работал с отладчиком Visual Studio 2003, ставил breakpoint'ы внутри дочернего потока и основного. После вызова WaitForSingleObject не один breakpoint не срабатывает).

По поводу Sleep(ms):
В дочернем потоке при каждой итерации выводил что-то типа AfxMessageBox(_T("hello")); (одна итерация длится порядка 5 секунд). Sleep(ms) вызвал в основном потоке с параметром 15000 (Sleep(15000)). По идее окошко с надписью "hello" за это время должно минимум раза два появиться с интервалом в 5 сек, а программа зависла на 15 сек. :(
11
02 сентября 2008 года
oxotnik333
2.9K / / 03.08.2007
Sleep(15000) это как раз и есть 15 сек.

что внутри
 
Код:
while(!flagExit){
          //код
     }
4.8K
02 сентября 2008 года
fakel15
54 / / 02.12.2005
Я как раз и расчитывал на то что Sleep(15000) - это 15 сек.

while(!flagExit){
AfxMessageBox(_T("hello")); //это для проверки sleep
//далее идет опрос оборудования, занимает порядка 5 сек.
}
11
02 сентября 2008 года
oxotnik333
2.9K / / 03.08.2007
while(flagExit==0) ... и тд...)
288
02 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: fakel15
Здравствуйте!
Возникла трудность в реализации корректного завершения потока.
код потока выглядит примерно так:

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

14
02 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: fakel15
Я как раз и расчитывал на то что Sleep(15000) - это 15 сек.
while(!flagExit){
AfxMessageBox(_T("hello")); //это для проверки sleep
//далее идет опрос оборудования, занимает порядка 5 сек.
}



Вполне может статься что вызов AfxMessageBox синхронизирован с основным потоком. Тут точно не скажу - это документацию надо читать, но я бы использовал MessageBeep() какой-нибудь, а ни в коем случае не окна

4.8K
02 сентября 2008 года
fakel15
54 / / 02.12.2005
Спасибо... :)
Буду пытаться!!!
4.8K
03 сентября 2008 года
fakel15
54 / / 02.12.2005
YAHOO!!!
получилось. :)
Большое всем спасибо!!!
Вся проблема была в том, что перед завершением, поток отправлял главному окну сообщение. А так как основной поток программы был занял Sleep'ом или WaitForSingleObject, то соответственно это сообщение ни как не обрабатывалось и прога висла. Очень помогла статья "Возможности встроенного отладчика Visual C++" с rsdn'а.
Всем удачи ;)))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог