Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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++ |
|
|
Судя по коду указанному в вопросе нить убивается насовсем. Сам я тоже использую дополнительные нити всегда работающие с процессом, и умирающие только вместе с ним. Наверное поэтому ничего страшного не происходило Но всё равно спасибо за развёрнутые объяснения, наверное всё таки придётся переделать |
|
Вернуться к началу |
|
|
chaka Гость
|
Добавлено: Чт Фев 20 2003 11:41 Заголовок сообщения: Re: Не могу корректно завершить thread в Visual C++ |
|
|
Хорошо, если нить умирает с процессом. Я даже сказал бы - очень хорошо, но что если это автономное ПО, которое должно работать без перезагрузки неделями, месяцами ... Вот когда такое "счастье" появляется - геморроя не оберешся |
|
Вернуться к началу |
|
|
|