|
|
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#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. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. И все хорошо пока он вызывается один раз. А вот если их уже два или три. То при вызове stopMyThreadCheckTasks произойдет что то не понятное. А надо чтобы вырубился определенный поток. Как отследить каждый поток отдельно и как вырубить определенный поток? Я так подозреваю надо где то брать Handle и через него убивать. Подскажите как корректно и как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 21:18 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
FIL23> MyThreadCheckTasks:=TMyThreadCheckTasks.Create(false); FIL23> procedure TMyThreadCheckTasks.Execute(); FIL23> while not MyThreadCheckTasks.Terminated do FIL23> ... FIL23> И все хорошо пока он вызывается один раз. FIL23> А вот если их уже два или три. Так это не про потоки вопросов, а про культуру использования переменных. Вот потоков у Вас два или три, а переменных? FIL23> То при вызове stopMyThreadCheckTasks произойдет что то не понятное. Ну почему же непонятное?... Это как раз вопрос на знание азов (почти на собес) - что произойдёт (эффектов будет несколько, более одного) ? FIL23> Как отследить каждый поток отдельно и как вырубить определенный поток? В простейшем случае - хранить ссылки на потоки в каком-то контейнере (а-ля TList<TThtread>) и соответственно у нужного вызывать Terminate c обнулением ссылки на него. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 21:44 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
FIL23, общего "корректного" метода нет. Если ты имеешь права убить нить, то можешь вызвать TerminateThread (хэндл), но - нельзя сказать, что это корректно. Система остановит выполнение, немножко почистит память (кажись, только стек нити) но останется куча мусора (критические секции, выделенная память в куче, ... ) - они запросто накроются накроются медным тазом. Нить должна завершаться сама, либо после завершения своей работы, либо по получению сигнала о необходимости завершиться. Найди книжку "Рихтер Дж. - Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows - 2008" - там в главе 6 совсем немного и понятно описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:01 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
FIL23 Я так подозреваю надо где то брать Handle и через него убивать. Это самый ппц метод, обычно после такого проще застрелиться, т.е. перезапустить процесс (не шучу). Если код убиваемой нити доступен - надо отлаживать, чтобы выход был по сообщению/флажку. Никакого "убиения" быть не должно, это чугуниевый люминь, метод нити должен завершаться сам, без вариантов. Можно, конечно, рассуждать о том, что есть чужие библиотеки, код которых недоступен, вот тогда можно и отстрелить по хэндлу, это похоже на отстрел собственной ноги бегуна в процессе марафона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:07 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
FIL23Подскажите как корректно и как надо. Корректно поток убить нельзя. Надо создавать потоки, которые корректно останавливаются сами по вежливой просьбе извне. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:09 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov корректно останавливаются скорее, корректно завершаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:13 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Это самый ппц метод, обычно после такого проще застрелиться, т.е. перезапустить процесс (не шучу). https://www.sql.ru/forum/1325656/kak-prervat-vypolneniya-zavisshey-funkcii некоторые уважаемые мемберы утверждают, что проблемы TerminateThread вполне решаемы и с ними можно жить. Более того, говорят, что вовсю используют этот метод. Мне слабо верится, хотя я и понимаю, что теоретически это возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:36 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Это вы его использованию одного потока учите... Он до этого ещё не дошёл, у него с переменными беда. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 22:40 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
FIL23, Если уж так хочется убивать - то используйте процессы - после них хотя бы память освобождается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 23:06 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
YuRock некоторые уважаемые мемберы утверждают ты не юли, ты пальцем покажи на этого гада ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 23:07 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Док YuRock некоторые уважаемые мемберы утверждают ты не юли, ты пальцем покажи на этого гада Это Александр прикалывается: 22211632 Кто не прыгал из окошка Вместе с маминым зонтом, Тот лихим парашютистом Не считается пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2020, 23:26 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Cobalt747> Если уж так хочется убивать - то используйте Cobalt747> процессы - после них хотя бы память освобождается. +1, кстати. Хоть и не всегда возможно/удобно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 20:43 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам Cobalt747> Если уж так хочется убивать - то используйте Cobalt747> процессы - после них хотя бы память освобождается. +1, кстати. Хоть и не всегда возможно/удобно. В принципе, нормально. Главное неудобство - нет доступа к памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 23:31 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
YuRock Гаджимурадов Рустам Cobalt747> Если уж так хочется убивать - то используйте Cobalt747> процессы - после них хотя бы память освобождается. +1, кстати. Хоть и не всегда возможно/удобно. В принципе, нормально. Главное неудобство - нет доступа к памяти. угу, особенно если эта библиотека (не будем показывать пальцем, но это конечно же pilot_nt.dll) течет памятью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 23:44 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Cobalt747 течет памятью. - Валит исключения наружу (которые, конечно же, не ловятся try..except) - Закрывает хэндлы выделенных мною (вообще отношения не имеющих к ней) юзер-объектов (эвенты обычно). Предпологаю, что это последствия вызова CloseHandle на мусор из памяти (или затирание переменной с хэндлом вышедшим за пределы массивом, не знаю). Это, конечно, самое страшное поведение, которое я встречал. Десяток разных "багов" в разных местах вылез. Даже клиент СУБД начал падать иногда с GetLastError=6 (ошибка доступа при WAIT_FAILED). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 23:57 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Не делайте сложных вещей в потоке который планируете небезопасно убивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 00:37 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
rgreat, Простые потоки не виснут, виснут как раз сложные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 09:56 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Видимо, хромиум потому и запускает по процессу на каждую страницу, что они не осилили поймать все возможные баги)) Если глюк - а пох, прибьем и перезапустим процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 10:44 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Видимо, хромиум Они и не скрывали это, а даже хвалились, как круто придумали. Правда у меня ощущение, что не они были первооткрывателями. К тому времени движки баз уже так работали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 10:53 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
wadman> Правда у меня ощущение, что не они были первооткрывателями. wadman> К тому времени движки баз уже так работали. Конечно, не они. Но сравнивать СУБД и ср***й браузер и хвалиться этим - это как-то совсем через край, ИМХО. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 11:13 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
wadman движки баз уже так работали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2020, 13:25 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Я бы сделал так. Будет работать при флаге freeonterminate := true; Synchronize конечно тормоз. Но один раз вызвать можно. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2020, 02:22 |
|
||
|
как корректно убить поток?
|
|||
|---|---|---|---|
|
#18+
Если несколько потоков, то стартуем так threads.Add (TMyThread.Create(procedure (const thread: TMyThread) begin threads.Remove (thread) end) А остановка потоков тогда будет такая: // тут ждём, пока все потоки не будут уничтожены While threads.Count > 0 do begin If not Threads.First.Terminated then Threads.First.Terminate; Sleep(0); end; Где threads - TList<TMyThread> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2020, 02:43 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40008648&tid=2037921]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 274ms |
| total: | 565ms |

| 0 / 0 |
