Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть некий класс. В конструкторе данного класса создаётся поток и событие для его завершения: Код: plaintext 1. 2. Далее программа работает, поток тоже работает. И тут происходит закрытие программы. Начинают вызываться все деструкторы. В деструкторе вышеупомянутого класса пытаюсь завершить поток и дождаться его завершения: Код: plaintext 1. 2. 3. Поток завершается 100%, проверял в отладчике. Но функция WaitForSingleObject не возвращает управление никогда. Программа висит и не завершается. В чём может быть причина ? Есть подозрения, что это может быть из-за того, что конструктор и деструктор класса вызываются в разных потоках. Т.е. тот поток, который ждёт завершения WaitForSingleObject не является родителем и создателем этого потока. Но по идее разницы быть не должно и всё должно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 21:40 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
cpp2015Программа висит и не завершается. А что показывает её Call Stack во время этого висения? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 21:52 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovcpp2015Программа висит и не завершается. А что показывает её Call Stack во время этого висения? Не знаю. Программа чужая. Я ей подсовываю свою dll в которой и создаётся мой экземпляр класса и поток в нём. Собственно, даже не сама чужая программа закрывается, а просто останавливается Lua-скрипт в ней, при остановке которого в моей dll вызываюся деструкторы и уничтожаются все прочие объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 22:09 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
cpp2015в моей dll вызываюся деструкторы В этом месте у DLL уже ничего нельзя ждать. Система впадает в дедлок, который ты и наблюдаешь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 22:23 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovcpp2015в моей dll вызываюся деструкторы В этом месте у DLL уже ничего нельзя ждать. Система впадает в дедлок, который ты и наблюдаешь. ничего не понял...нельзя ли разжевать или хотя бы указать направление гугления? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 12:14 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
ВасяЧалыйнельзя ли разжевать или хотя бы указать направление гугления? https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx Второй абзац и далее по ссылке. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 13:20 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
И как тогда быть ? Мне надо при завершении работы приложения всё почистить и убрать за собой. Остановить запущенные мною потоки. Каждый раз не глядя делать TerminateThread не правильно, т.к. иногда приходится останавливать эти потоки и вызывать деструкторы классов штатно в процессе работы приложения без его завершения. Как отличить в dll, что сейчас происходит принудительное завершение приложения, а например не штатный вызов пользователем функции деструктора для последующей работы. Dll использует также и приложение на C#.NET. Там сборщик мусора вообще вызывает деструкторы на своё усмотрение. В итоге имеем, что закрыть приложение нельзя, т.к. работают потоки в нём и приложения просто висят в процессах системы, ожидают завершения всех своих потоков. Потоки остановить тоже нельзя, т.к. WaitForSingleObject зависает, и даже функция Sleep также зависает. Прибить потоки в деструкторе класса с помощью TerminateThread тоже нельзя, т.к. этот деструктор является необходимым атрибутом логики работы приложения и может вызываться в процессе всего жизненного цикла произвольное количество раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 08:02 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
Если приложение оконное - можно попробовать поставить хук на сообщение WM_CLOSE или WM_QUIT или WM_DESTROY (не помню точно какое при закрытии приходит). Для консольного SetConsoleCtrlHandler() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 08:17 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
cpp2015И как тогда быть ? Не ждать потоки. Просигналил им "стоп" и хватит, пусть заканчиваются как моно скорее. Не успеют - вызываемый стандартной RTL ExitProcess их пристрелит принудительно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 11:49 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovcpp2015И как тогда быть ? Не ждать потоки. Просигналил им "стоп" и хватит, пусть заканчиваются как моно скорее. Не успеют - вызываемый стандартной RTL ExitProcess их пристрелит принудительно. Никто их не пристреливает принудительно, если самому не вызвать явно TerminateThread. Если по какой-то причине потоки тоже чего-то ждут (например в вызове внешней Callback функции и пр.), то процесс так и остаётся висеть, пока его не убьёшь в диспетчере задач. Нет, можно конечно, послать сигнал о стопе и забыть про них. И в 90% случаев этого хватит. Но всё же хочется, чтобы всё всегда гарантированно закрывалось и уничтожалось. Пока решил ставить флаг при вызове деструктора, что класс уничтожается и по наличию этого флага сразу делать TerminateThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 12:18 |
|
||
|
WaitForSingleObject не реагирует на завершение потока
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 12:54 |
|
||
|
|

start [/forum/search_topic.php?author=Jurnio&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 441ms |
| total: | 628ms |

| 0 / 0 |
