|
|
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
в приложении есть треды (один, два, десять, хоть сто). Пытаюсь их корректно останавливать. В закрытии главного окна делаю Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: 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. Проблема тут - 10с проходит, WAIT_TIMEOUT не срабатывает. Не срабатывает он и потом. В отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормально. Но чудес же не бывает. Я что-то делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:13:34 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
to get extended information call GetLastError ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:28:39 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
error нет. есть MsgWaitForMultipleObjects, который крутится себе в вечном цикле, сообщения оконные обрабатывает, все такое - но выходить не выходит, ни по таймауту, ни с ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:45:33 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0r, На АОПе еще кто-то играет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:46:10 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
КвейдVizit0r, На АОПе еще кто-то играет? ты задаешь этот вопрос уже второй или третий раз. Я не в курсе, я не играю ни там, ни вообще на каком-то шарде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 17:54:40 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
А если сделать так? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:04:30 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rWAIT_TIMEOUT не срабатываеЗначит срабатывает, что-то другое. Например, WAIT_FAILED, что приводит к бесконечному циклу. А сам WAIT_FAILED возникает из-за того, что был вызван деструктор потока, который закрыл хэндл, и Вы ломитесь по невалидному хендлу. Чтобы такого не происходило, нужн 1) Заблаговременно вызывать DuplicateHandle 2) Предусматривать ВСЕ возможные возвращаемые значения Vizit0rВ отладке же чудеса - если кидаю бряк на выход из процедуры - срабатывает таймаут нормальноПотому что меняется тайминг и поток не успевает вызвать деструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:05:24 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
ну деструктор не вызывается, потому что FreeOnTerminate = False, но ход мыслей я понял. Кстати, а DuplicateHandle зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:03:14 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток сделает своему хэндлу CloseHandle() у тебя осталась валидная копия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:08:46 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
интересно. Не знал, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 16:31:02 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, когда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 17:02:55 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMкогда поток сам делает своему хэндлу CloseHandle() то это, наверное, не очень правильно ?Почему? Что в этом не правильного? Есть класс TThread, который инкапсулирует работу с потоком. Этот класс в своем конструкторе создает поток и получает его хэндл. Будет вполне логично этот хэндл закрыть, когда у класса отпадет в нем необходимость. Что он и делает. Закрыти хэндла на работоспособность потока никак не влияет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 22:12:07 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Vizit0rинтересно. Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 22:13:40 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копиивот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 01:07:17 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Vizit0rинтересно. Не знал, спасибо.Только не забудь сам вызвать CloseHandle() для полученной копии ну это само собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 08:50:18 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMвот-вот, а по сути, конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока.Хэндл получается в конструкторе класса, закрывается в деструкторе класса. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2017, 22:07:49 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Что не так?DuplicateHandle зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2017, 01:54:42 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeM, _Vasilisk_Vizit0rКстати, а DuplicateHandle зачем?Чтобы, когда поток ( читать - объект класса TThread ) сделает своему хэндлу CloseHandle() у тебя осталась валидная копия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2017, 21:21:45 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_когда поток (читать - объект класса TThread) сделает своему хэндлу CloseHandle() конструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Ситуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 00:14:30 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
Bred eFeMконструктор то у тебя вне потока получает этот Handle, значит, архитектурно правильно, его и закрыть вне потока Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 14:54:39 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, как это хэндл используется где-то вне этого объекта после класс TThread, который инкапсулирует работу с потоком. Ладно, CloseThread(Self); )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 15:46:37 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Bred eFeMпропущено... Опять по новому кругу. Ну открой ты исходники и посмотри TThread.Create, TThread.Destroy Bred eFeMСитуация, когда в рамках одного процесса действительно нужна копия хэндла, мне непонятна.Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию Я дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:08:12 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:11:06 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_schiЯ дико извиняюсь, но Handle - это сущность, которой владеет процесс, а не поток.И что? Эта фраза "Хендлом владеет экземпляр класса TThread. Он его порождает, он же его и убивает. Если хэндл используется где-то вне этого объекта и существует вероятность обращения к этому хэндлу после уничтожения объекта, то нужно делать копию " меня напрягла. Как только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечно. И зачем этот зомби нужен ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:26:54 |
|
||
|
Корректное завершение потока
|
|||
|---|---|---|---|
|
#18+
schiКак только ты сделал DuplicateHandle, тебе надо его явно закрывать, причем всегда, иначе объект потока будет жить вечноА где я говорил другое?_Vasilisk_Только не забудь сам вызвать CloseHandle() для полученной копии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2017, 17:51:58 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39477386&tid=2042091]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 199ms |
| total: | 349ms |

| 0 / 0 |
