powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / WaitForSingleObject не реагирует на завершение потока
11 сообщений из 11, страница 1 из 1
WaitForSingleObject не реагирует на завершение потока
    #38966841
cpp2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть некий класс. В конструкторе данного класса создаётся поток и событие для его завершения:
Код: plaintext
1.
2.
hThread = CreateThread...
hEventTermination = CreateEvent ...


Далее программа работает, поток тоже работает. И тут происходит закрытие программы. Начинают вызываться все деструкторы. В деструкторе вышеупомянутого класса пытаюсь завершить поток и дождаться его завершения:
Код: plaintext
1.
2.
3.
SetEvent(hEventTermination);
WaitForSingleObject(hThread, INFINITE);
CloseHandle( ...


Поток завершается 100%, проверял в отладчике. Но функция WaitForSingleObject не возвращает управление никогда. Программа висит и не завершается. В чём может быть причина ?

Есть подозрения, что это может быть из-за того, что конструктор и деструктор класса вызываются в разных потоках. Т.е. тот поток, который ждёт завершения WaitForSingleObject не является родителем и создателем этого потока. Но по идее разницы быть не должно и всё должно работать.
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38966846
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cpp2015Программа висит и не завершается.
А что показывает её Call Stack во время этого висения?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38966850
cpp2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovcpp2015Программа висит и не завершается.
А что показывает её Call Stack во время этого висения?

Не знаю. Программа чужая. Я ей подсовываю свою dll в которой и создаётся мой экземпляр класса и поток в нём. Собственно, даже не сама чужая программа закрывается, а просто останавливается Lua-скрипт в ней, при остановке которого в моей dll вызываюся деструкторы и уничтожаются все прочие объекты.
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38966852
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cpp2015в моей dll вызываюся деструкторы
В этом месте у DLL уже ничего нельзя ждать. Система впадает в дедлок, который ты и наблюдаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38971693
ВасяЧалый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovcpp2015в моей dll вызываюся деструкторы
В этом месте у DLL уже ничего нельзя ждать. Система впадает в дедлок, который ты и наблюдаешь.


ничего не понял...нельзя ли разжевать или хотя бы указать направление гугления?
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38971783
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВасяЧалыйнельзя ли разжевать или хотя бы указать направление гугления?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx
Второй абзац и далее по ссылке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38974833
cpp2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как тогда быть ?
Мне надо при завершении работы приложения всё почистить и убрать за собой. Остановить запущенные мною потоки. Каждый раз не глядя делать TerminateThread не правильно, т.к. иногда приходится останавливать эти потоки и вызывать деструкторы классов штатно в процессе работы приложения без его завершения.
Как отличить в dll, что сейчас происходит принудительное завершение приложения, а например не штатный вызов пользователем функции деструктора для последующей работы.
Dll использует также и приложение на C#.NET. Там сборщик мусора вообще вызывает деструкторы на своё усмотрение.

В итоге имеем, что закрыть приложение нельзя, т.к. работают потоки в нём и приложения просто висят в процессах системы, ожидают завершения всех своих потоков. Потоки остановить тоже нельзя, т.к. WaitForSingleObject зависает, и даже функция Sleep также зависает. Прибить потоки в деструкторе класса с помощью TerminateThread тоже нельзя, т.к. этот деструктор является необходимым атрибутом логики работы приложения и может вызываться в процессе всего жизненного цикла произвольное количество раз.
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38974838
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если приложение оконное - можно попробовать поставить хук на сообщение WM_CLOSE или WM_QUIT или WM_DESTROY (не помню точно какое при закрытии приходит).
Для консольного SetConsoleCtrlHandler()
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38975072
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cpp2015И как тогда быть ?
Не ждать потоки. Просигналил им "стоп" и хватит, пусть заканчиваются как моно скорее. Не
успеют - вызываемый стандартной RTL ExitProcess их пристрелит принудительно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38975122
cpp2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovcpp2015И как тогда быть ?
Не ждать потоки. Просигналил им "стоп" и хватит, пусть заканчиваются как моно скорее. Не
успеют - вызываемый стандартной RTL ExitProcess их пристрелит принудительно.

Никто их не пристреливает принудительно, если самому не вызвать явно TerminateThread. Если по какой-то причине потоки тоже чего-то ждут (например в вызове внешней Callback функции и пр.), то процесс так и остаётся висеть, пока его не убьёшь в диспетчере задач.
Нет, можно конечно, послать сигнал о стопе и забыть про них. И в 90% случаев этого хватит. Но всё же хочется, чтобы всё всегда гарантированно закрывалось и уничтожалось.
Пока решил ставить флаг при вызове деструктора, что класс уничтожается и по наличию этого флага сразу делать TerminateThread.
...
Рейтинг: 0 / 0
WaitForSingleObject не реагирует на завершение потока
    #38975189
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cpp2015Никто их не пристреливает принудительно, если самому не вызвать явно
TerminateThread.
Потому что ты загнал систему в deadlock и она ещё не дошла до этого вызова.

RTFM: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682658(v=vs.85).aspx
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / WaitForSingleObject не реагирует на завершение потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]