|
|
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
После закрытия формы (XE6) крестиком на экране всё исчезает, но вот в Диспетчере задач my.exe кочует из Приложения в Фоновые процессы, посему не позволяет запустить это приложение в следующий раз. Приходится вручную нажимать "Снять задачу". Перепробовал внутри TFormMain.FormDestroy: Application.Terminate; // не помогло Halt(700); //не помогло даже попробовал: FreeAndNil(Application); //не помогло Причём этой проблемы нет если запускать (Run (F9)) и закрывать из RAD Studio XE6, правда при закрытии приложения запущенного из Studio надо нажимать Control Reset (CTRL + F2) (это красная квадратная кнопка наверху). Как закрыть приложение, ставшее невидимым из фонового процесса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 09:00 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, авторПерепробовал внутри TFormMain.FormDestroy: Application.Terminate; // не помогло Halt(700); //не помогло даже попробовал: FreeAndNil(Application); //не помогло можно попробовать еще множество костылей с нулевым результатом. а можно поискать, почему процесс виснет. например: запущенные, но не остановленные потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:08 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, абсолютно согласен. Эти потоки я нашёл и даже пытался их уничтожить как товарищ советовал здесь https://stackoverflow.com/questions/29732200/delphi-memory-leak-warning-message Но после добавления в TFormMain.FormDestroy именно Код: pascal 1. 2. перестало закрываться приложение одновременно с тем, что перестал давать сообщения об утечке памяти (у меня ReportMemoryLeaksOnShutdown := True;). Как правильно остановить запущеный поток? Где (в какой процедуре это лучше сделать) это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:25 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, если создаёшь в OnCreate, то в OnDestroy и разрушай. почему виснет - ищи. у тебя целый отладчик, смотри, как разрушается твоё приложение и где конкретно виснет. бряков побольше и постадийно. как вариант, как только повисло - жмёшь кнопку Pause в среде, она приостановит приложение, жмёшь ctrl+alt+t, смотришь список потоков и по колл-стэкам ищешь повисший. вангую, что на FreeAndNil(Thread) и виснет. что делать? разбираться с тем, как корректно можно завершить поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:31 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, ты прав как Эйнштейн, виснет как раз после Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:33 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, только не после, а в. поток нужно нормально остановить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:36 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, "что делать? разбираться с тем, как корректно можно завершить поток." согласен, если покажешь на простом примере как правильно завершить поток было бы здорово, я разбираюсь с потоком, который создал другой товарищ, сложно рулить его завершением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:36 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, нужно добиться завершения его основного, внутрипоточного, метода Execute. как только Execute закончится, достаточно быстро остановится и поток. что конкретно мешает Execute закончится - смотри по коду. опять же вангую, что там есть какой-то объект синхронизации. вот его нужно запустить, что бы поток 'прокрутился' до конца Execute. вообще, если поток чужой, можешь требовать от него дополнительный метод корректной его остановки. ну или делай его сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 12:39 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, да ты опять прав "только не после, а в. ... " согласен "...поток нужно нормально остановить." Код: 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. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. Как добиться завершения его основного, внутрипоточного, метода Execute? Согласен "как только Execute закончится, достаточно быстро остановится и поток." Что конкретно мешает Execute закончится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 13:01 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, Будет кочевых программистов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 13:08 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAry, код, конечно, ужасный. улучшаем: 1. нужно избавится от глобальных переменых CommandEvent, Thread 2. сделать InitEvent, FreeEvent методами класса TEventWaitThread. Проще всего в виде конструктора и деструктора класса. Почему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 13:19 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaonЧто сделать? Установить CommandEvent (с помощью SetEvent).Я бы сделал это в деструкторе потока между Terminate и inherited Destroy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 14:53 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
YuRock, авторЯ бы сделал это в деструкторе потока между Terminate и inherited Destroy. Деструктор вызовется раньше конца Execute? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 15:04 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, еще одна красота обнаружена ) FreeOnTerminate := True; лучше убрать и самому разрушать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 15:06 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaonYuRock, авторЯ бы сделал это в деструкторе потока между Terminate и inherited Destroy. Деструктор вызовется раньше конца Execute?Он вызовется перед WaitFor, что главное. Вызовется "внутри" FreeAndNil, "на котором" и виснет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 19:13 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaonеще одна красота обнаружена ) FreeOnTerminate := True; лучше убрать и самому разрушать. я вот все думал - неужели эта истина очевидна лишь мне? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 19:37 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaonmakhaon, еще одна красота обнаружена ) FreeOnTerminate := True; лучше убрать и самому разрушать.FreeOnTerminate := True; оправдан когда результат работы треда далее в программе не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 19:43 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
rgreatmakhaonmakhaon, еще одна красота обнаружена ) FreeOnTerminate := True; лучше убрать и самому разрушать.FreeOnTerminate := True; оправдан когда результат работы треда далее в программе не нужен.Надо сказать, редчайший случай, да и это единственное мнимое удобства элементарно решается без этого флага. Зато еще этот флаг очень вреден, когда логика подразумевает возможность принудительной остановки (и/или перезапуска) этого потока. А еще - при логике, которая подразумевает строгий порядок остановки потоков. А еще - неизвестно, что с этим флагом будет при выгрузке dll. Да много случаев, когда этот флаг будет только мешать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2018, 22:59 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
makhaon, если проделаю (точнее если смогу всё это правильно сделать) "улучшаем: 1. нужно избавится от глобальных переменых CommandEvent, Thread 2. сделать InitEvent, FreeEvent методами класса TEventWaitThread. Проще всего в виде конструктора и деструктора класса. Почему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)." это исправит ситуацию с утечкой памяти (сообщение FastMM)?: Код: pascal 1. 2. Может быть пока только сделать?: "Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2018, 10:36 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAryПочему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)." это исправит ситуацию с утечкой памяти (сообщение FastMM)?:Исправит ситуацию с утечкой - освобождение объекта потока. А освободиться он сможет только после того, как завершится. А завершиться он сможет только после того, как закончиться Execute. А это произойдет только после того, как завершится WaitForSingleObject. Все сложно, а как ты хотел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2018, 13:51 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
YuRock, почему "... бесконечно ожидаем CommandEvent в WaitForSingleObject."? Было всё нормально, приложение отлично работало, но просто было при закрытии сообщение от FastMM об утечке памяти: Код: pascal 1. 2. Чтобы ликвидировать утечку, в Код: pascal 1. добавил в конце Код: pascal 1. После этого при закрытии крестиком приложение визуально исчезает, но переходя из Приложения в Фоновые процессы (в Диспетчере задач) продолжает висеть в Фоновых процессах, не позволяя запустить приложение в следующий раз. Может быть неправильно использовать Код: pascal 1. для ликвидации утечки? Тогда как ликвидировать утечку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 06:54 |
|
||
|
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
|
|||
|---|---|---|---|
|
#18+
AdamAryМожет быть неправильно использовать Код: pascal 1. для ликвидации утечки? Правильно. Особенно, если FreeOnTerminate у потока убрать. AdamAryТогда как ликвидировать утечку? 21737398 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 21:01 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39734643&tid=2040103]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
165ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 482ms |

| 0 / 0 |
