|
|
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
В каких случаях может зависать "WaitForSingleOnject(..., INFINITE);"? Вызываю destroy(); у TThread, и доходя до вызова этой функции, поток, вызвавший destroy(); другого (вложенного) потока, зависает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 21:09 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
А что является хендлом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 21:58 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
X-Cite , видимо, Handle завершаемого потока. Это подставляется автоматически в TThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 22:07 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtecВ каких случаях может зависать "WaitForSingleOnject(..., INFINITE);"? Когда ожидаемый объект не переходит в возбуждённое состояние. Ну или проще: когда программист не понимает что он делает. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 22:08 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, А у вас выход из Execute вложенного потока происходит? (Если там цикл бесконечный...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 22:16 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2020, 22:27 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
X-Cite , в том и дело, что в Execute выход происходит. Выложить код не могу, потому что программа очень большая. Пытался повторить ошибку на какой-нибудь маленькой программе, но не получается. Не получается ошибиться! Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2020, 07:09 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec Вот и думаю, может быть, кто-нибудь знает по опыту, по каким причинам могут возникать такие проблемы. Со стороны эта просьба выглядит так: "Код не покажу, угадайте - "почему?". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2020, 08:04 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec В каких случаях может зависать "WaitForSingleOnject Когда WaitForSingleObject ждёт поток, который делает Synchronize. Глюк TThread в связке WaitForSingleObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2020, 11:03 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtecпо каким причинам могут возникать такие проблемы. И ты будешь проверять каждую из туевой хучи таких причин? Не майся дурью, в момент зависания смотри CallStack всех потоков и определяй причину дедлока. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2020, 13:34 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Все вдруг стало ясно и понятно, а как исправить - не знаю. Ситуация в следующем: есть родительский поток и другой поток, вложенный в него. Вовне происходит нечто, что заставляет вложенный поток сгенерировать некое событие, в ответ на которое родительский поток его удаляет. И, видимо, в этом проблема: так как родительский поток удаляет вложенный по его же запросу, то из-за этого вложенный и зависает на вызове "WaitFor()" - (предполагаю,) потому что вызов "WaitFor()" происходит из контекста вложенного потока. Так ли это? Если да, то как бороть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2020, 21:07 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec Все вдруг стало ясно и понятно, а как исправить - не знаю. Ситуация в следующем: есть родительский поток и другой поток, вложенный в него. Вовне происходит нечто, что заставляет вложенный поток сгенерировать некое событие, в ответ на которое родительский поток его удаляет. И, видимо, в этом проблема: так как родительский поток удаляет вложенный по его же запросу, то из-за этого вложенный и зависает на вызове "WaitFor()" - (предполагаю,) потому что вызов "WaitFor()" происходит из контекста вложенного потока. Так ли это? Если да, то как бороть? Ты как про что-то, не тобой сделанное, рассказываешь. Или ты тоже не видишь "проблемный" код, как и мы? ... ...eсли WaitFor*() делает не то, что ты от него ждешь - для чего ты его вообще используешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2020, 21:25 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
ъъъъъ , я использую не "WaitFor()" напрямую, но вызывается он автоматически в Delphi при вызове "TThread.destroy()", и там же и зависает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2020, 21:31 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Варианты пока такие: 1. Вызывать удаление вложенного потока в TThread.queue(). 2. Поставить вложенному потоку "FreeOnTerminate := true" и удалять его через "TThread.terminate()". Либо, еще какие-то есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2020, 21:40 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, код то покажи, желательно в самом простом варианте повторения проблемы гаданием и снятием порчи по фотографии другие люди занимаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2020, 08:21 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, использую простое правило - поток сам себя не удаляет, просто нотифицирует родительский о том, что он закончил работу. Как это сделать - вариантов много: через оконные сообщения, через переменные, через очереди, можно просто завершиться, а родительский раз в 100 мсек проверяет его статус и если он закончился вызывает ему Free ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2020, 10:06 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Как реализовано это "некое событие"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2020, 10:51 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Ситуация следующая. Есть ParentThread - родительский поток и ChildThread - вложенный. ChildThread был таков: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. А ParentThread - таков: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Зависает на "childThread.destroy()", если после этой строки поместить еще функцию, то до нее компилятор не дойдет. Зависновение происходит в стандартном "TThread.destroy()" на вызове "waitFor()". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2020, 20:16 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, а по твоему обработчик TParentThread.removeChild в каком потоке вызывается и кого ждёт? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2020, 21:13 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
VirtaOtec Код: pascal 1. 2. 3. Это вызывается в основном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2020, 07:05 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
По сути, вот что вы написали: Код: pascal 1. 2. 3. 4. Но так делать нельзя. Решение: не вызывать деструктор в OnDeleted, а просто установить некий белевый флаг CanFreeChild := True и вызывать деструктор из родительского потока в Execute: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2020, 08:26 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
zedxxx Решение: не вызывать деструктор в OnDeleted, а просто установить некий белевый флаг CanFreeChild := True и вызывать деструктор из родительского потока в Execute ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2020, 14:25 |
|
||
|
Зависает WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Ну да. Но это синтетический и упрощённый пример того, как послать сообщение родительскому потоку о завершении работы и передать ему управление. У топикстартера с этим проблема. К тому же, в реальной жизни дочерний поток может и не нужно убивать или есть какая-то причина, почему именно родительский поток должен управлять временем жизни дочернего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2020, 15:05 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39940608&tid=2038454]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 373ms |

| 0 / 0 |
