Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Не могу корректно завершить thread в Visual C++

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
chajka
Гость





СообщениеДобавлено: Ср Фев 19 2003 15:38    Заголовок сообщения: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

Для завершения я использую СEvent однако при выполнении функции
::WaitForSingleObject(event,INFINITE); программа виснет. Если эту строчку закомментировать то все в порядке за исключением небольшого идиотизма: происходит утечка памяти.
Вот код программы.
//DlgThread.cpp
//...
int CDlgThread::Run()
{
// TODO: Add your specialized code
//..
for(int i=0; iExitFlag = true;
::WaitForSingleObject(m_pDlgThread->m_ThreadEndEvent , INFINITE);// в этой строке программа виснет
::TerminateThread(m_pDlgThread->operator HANDLE(), 0);
delete m_pDlgThread;
CDialog::OnClose();
}
//...
Подскажите пожалуйста - что делать?
Вернуться к началу
chaka
Гость





СообщениеДобавлено: Ср Фев 19 2003 19:42    Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

Обычно процесс завершения нити происходит следующим образом:
1. Даем знать нити, что ей пора завершаться (самое простое - это вызов из ждущей нити InterlockedIncrement(переменная_которую_периодически_читает_ рабочая_нить).
2. Содимся на ожидание WaitForSingleObject(event,...), где event - HANDLE нити, которую будем ждать или событие, которое должна выставить рабочаяя нить при выходе.
3. Ждать можно или INFINITE, но тогда, если вдруг рабочая нить подвиснет, то о-о-о-пс!, так что лучше ждать какое-то время, по истечении которого убивать рабочую нить.
P.S. А чтобы рабочая нить быстрее завершилась, ей можно немного поднять приоритет. Таким образом сценарий такой:
InterlockedIncrement(val);
SetThreadPriority(THREAD _PRIORITY_ABOVE_NORMAL);// W2K
DWORD dwRes = WaitForSingleObject(hThread, time);
if(dwRes == WAIT_TIMEOUT){
TerminateThread(hThread, -1);
}
Вернуться к началу
Дрейф



Зарегистрирован: 20.02.2003
Сообщения: 9

СообщениеДобавлено: Чт Фев 20 2003 10:55    Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

А зачем в ожидание входить? Нельзя вот так:

GetExitCodeThread(hThr,&dExit);
TerminateThread(hTh r,dExit);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
chaka
Гость





СообщениеДобавлено: Чт Фев 20 2003 11:23    Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

Ну, это как "нож в сердце"...
TerminateThread() завершает нить не сообщая ей об этом. В результате деструкторы объектов, созданных автомотичеси (в стеке данной нити) или динамически (в куче) не вызываются, если в рабочей нити используется куча, то неизбежно происходит утечка памяти. Если нить ведет себя как конечный автомат, который имеет начальное, конечное и несколько промежуточных состояний и(или) обрабатывает данные (а это основная причина для создания многопоточных приложений), то может оказаться, что для повторного запуска этой нити (без перезапуска всего процесса) необходимы действия по освобождению ресурсов или переходу в какое-нибудь устойчевое состояние (сброс данных на диск и т.д.).
Так что TerminateThread() - это крайний способ, который ДОЛЖЕН использоваться ТОЛЬКО для аварийного завершения нити. После такого действия нет никаких гарантий относительно того, какая часть работы была проделана рабочей нитью и может ли эта нить быть запущена снова. Это же касается вызова из рабочей нити ExitThread() вместо return из функции, которая является точкой входа для даннй нити.
P.S. Если используется CRT (а эта библиотека используется ВО ВСЕХ ПРОГРАММАХ НА C/C++), то CreateThread() необходимо заминить на _beginthreadex() и, соответственно, ExitThread() на _endthreadex() если подобное завершение нити все же имеет место в программе.
Вернуться к началу
Дрейф



Зарегистрирован: 20.02.2003
Сообщения: 9

СообщениеДобавлено: Чт Фев 20 2003 11:34    Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

Судя по коду указанному в вопросе нить убивается насовсем. Сам я тоже использую дополнительные нити всегда работающие с процессом, и умирающие только вместе с ним. Наверное поэтому ничего страшного не происходило Smile Но всё равно спасибо за развёрнутые объяснения, наверное всё таки придётся переделать Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
chaka
Гость





СообщениеДобавлено: Чт Фев 20 2003 11:41    Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ Ответить с цитатой

Хорошо, если нить умирает с процессом.
Я даже сказал бы - очень хорошо, но что если это автономное ПО, которое должно работать без перезагрузки неделями, месяцами ...
Вот когда такое "счастье" появляется - геморроя не оберешся Smile
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...