powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
22 сообщений из 22, страница 1 из 1
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734454
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После закрытия формы (XE6) крестиком на экране всё исчезает, но вот в Диспетчере задач my.exe кочует из Приложения в Фоновые процессы, посему не позволяет запустить это приложение в следующий раз. Приходится вручную нажимать "Снять задачу".

Перепробовал внутри TFormMain.FormDestroy:
Application.Terminate; // не помогло
Halt(700); //не помогло
даже попробовал:
FreeAndNil(Application); //не помогло

Причём этой проблемы нет если запускать (Run (F9)) и закрывать из RAD Studio XE6, правда при закрытии приложения запущенного из Studio надо нажимать Control Reset (CTRL + F2) (это красная квадратная кнопка наверху).

Как закрыть приложение, ставшее невидимым из фонового процесса?
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734485
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

авторПерепробовал внутри TFormMain.FormDestroy:
Application.Terminate; // не помогло
Halt(700); //не помогло
даже попробовал:
FreeAndNil(Application); //не помогло

можно попробовать еще множество костылей с нулевым результатом. а можно поискать, почему процесс виснет. например: запущенные, но не остановленные потоки.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734494
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,
абсолютно согласен.

Эти потоки я нашёл и даже пытался их уничтожить как товарищ советовал здесь
https://stackoverflow.com/questions/29732200/delphi-memory-leak-warning-message
Но после добавления в TFormMain.FormDestroy именно
Код: pascal
1.
2.
FreeAndNil(Thread);
inherited;


перестало закрываться приложение одновременно с тем, что перестал давать сообщения об утечке памяти (у меня ReportMemoryLeaksOnShutdown := True;).

Как правильно остановить запущеный поток?
Где (в какой процедуре это лучше сделать) это сделать?
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734499
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

если создаёшь в OnCreate, то в OnDestroy и разрушай. почему виснет - ищи. у тебя целый отладчик, смотри, как разрушается твоё приложение и где конкретно виснет. бряков побольше и постадийно. как вариант, как только повисло - жмёшь кнопку Pause в среде, она приостановит приложение, жмёшь ctrl+alt+t, смотришь список потоков и по колл-стэкам ищешь повисший. вангую, что на FreeAndNil(Thread) и виснет. что делать? разбираться с тем, как корректно можно завершить поток.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734502
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,
ты прав как Эйнштейн, виснет как раз после
Код: pascal
1.
FreeAndNil(Thread)
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734505
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

только не после, а в. поток нужно нормально остановить.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734507
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

"что делать? разбираться с тем, как корректно можно завершить поток."
согласен,
если покажешь на простом примере как правильно завершить поток было бы здорово, я разбираюсь с потоком, который создал другой товарищ, сложно рулить его завершением.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734509
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

нужно добиться завершения его основного, внутрипоточного, метода Execute. как только Execute закончится, достаточно быстро остановится и поток. что конкретно мешает Execute закончится - смотри по коду. опять же вангую, что там есть какой-то объект синхронизации. вот его нужно запустить, что бы поток 'прокрутился' до конца Execute. вообще, если поток чужой, можешь требовать от него дополнительный метод корректной его остановки. ну или делай его сам.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734514
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
unit uEvntWitThrd;

interface

uses
  Windows, Classes, Messages, SysUtils, Forms, StrUtils;

type
  TEventWaitThread = class(TThread)
  private
    FWindow: HWND;
  protected
    procedure Execute; override;

  public
    constructor Create(const AWindow: HWND); reintroduce;
  end;
var
CommandEvent: THandle;
...
Thread: TThread;
...
  procedure InitEvent;
  procedure FreeEvent;

implementation

procedure InitEvent;
var
  Param: string;
  BytesWritten: DWORD;
begin
  // Пытаемся 
 ...
      CommandEvent := OpenEvent(EVENT_MODIFY_STATE, False, EventName);
      SetEvent(CommandEvent);
      // Закрываем все дескрипторы
      CloseHandle(CommandEvent);
...
    end;

    ExitProcess(0);
  end;

    // Создаём событие для сигнализирования о поступлении данных
  CommandEvent := CreateEvent(nil, False, False, EventName);
end;

procedure FreeEvent;
begin
  Thread.Terminate;

  CommandEvent := OpenEvent(EVENT_MODIFY_STATE, False, EventName);
  SetEvent(CommandEvent);

  // Закрываем все дескрипторы
  CloseHandle(CommandEvent);
  CloseHandle(ClientMailslotHandle);
end;
{ TEventWaitThread }

constructor TEventWaitThread.Create(const AWindow: HWND);
begin
  inherited Create(False);

  FreeOnTerminate := True;

  FWindow := AWindow;
end;

procedure TEventWaitThread.Execute;
begin
  while not Terminated do
  begin
    if WaitForSingleObject(CommandEvent, INFINITE) <> WAIT_OBJECT_0 then
      Exit;

    if Terminated then
      Exit;

    PostMessage(FWindow, WM_COMMANDARRIVED, 0, 0);
  end;
end;

end.



Как добиться завершения его основного, внутрипоточного, метода Execute?

Согласен "как только Execute закончится, достаточно быстро остановится и поток."

Что конкретно мешает Execute закончится?
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734516
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

Будет кочевых программистов...
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734518
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

код, конечно, ужасный.
улучшаем:
1. нужно избавится от глобальных переменых CommandEvent, Thread
2. сделать InitEvent, FreeEvent методами класса TEventWaitThread. Проще всего в виде конструктора и деструктора класса.

Почему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent).
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734540
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonЧто сделать? Установить CommandEvent (с помощью SetEvent).Я бы сделал это в деструкторе потока между Terminate и inherited Destroy.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734542
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

авторЯ бы сделал это в деструкторе потока между Terminate и inherited Destroy.
Деструктор вызовется раньше конца Execute?
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734543
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

еще одна красота обнаружена )

FreeOnTerminate := True;

лучше убрать и самому разрушать.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734619
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

авторЯ бы сделал это в деструкторе потока между Terminate и inherited Destroy.
Деструктор вызовется раньше конца Execute?Он вызовется перед WaitFor, что главное. Вызовется "внутри" FreeAndNil, "на котором" и виснет.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734621
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonеще одна красота обнаружена )

FreeOnTerminate := True;

лучше убрать и самому разрушать.
я вот все думал - неужели эта истина очевидна лишь мне? :)
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734623
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonmakhaon,

еще одна красота обнаружена )

FreeOnTerminate := True;

лучше убрать и самому разрушать.FreeOnTerminate := True; оправдан когда результат работы треда далее в программе не нужен.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734643
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatmakhaonmakhaon,

еще одна красота обнаружена )

FreeOnTerminate := True;

лучше убрать и самому разрушать.FreeOnTerminate := True; оправдан когда результат работы треда далее в программе не нужен.Надо сказать, редчайший случай, да и это единственное мнимое удобства элементарно решается без этого флага.
Зато еще этот флаг очень вреден, когда логика подразумевает возможность принудительной остановки (и/или перезапуска) этого потока.
А еще - при логике, которая подразумевает строгий порядок остановки потоков.
А еще - неизвестно, что с этим флагом будет при выгрузке dll.
Да много случаев, когда этот флаг будет только мешать.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734729
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

если проделаю (точнее если смогу всё это правильно сделать)

"улучшаем:
1. нужно избавится от глобальных переменых CommandEvent, Thread
2. сделать InitEvent, FreeEvent методами класса TEventWaitThread. Проще всего в виде конструктора и деструктора класса.

Почему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)."

это исправит ситуацию с утечкой памяти (сообщение FastMM)?:

Код: pascal
1.
2.
An unexpected memory leak has occurred. the unexpected small block leaks are:
69 - 76 bytes: TEventWaitThread x 1



Может быть пока только сделать?:
"Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)"
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734782
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAryПочему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)."

это исправит ситуацию с утечкой памяти (сообщение FastMM)?:Исправит ситуацию с утечкой - освобождение объекта потока.
А освободиться он сможет только после того, как завершится.
А завершиться он сможет только после того, как закончиться Execute.
А это произойдет только после того, как завершится WaitForSingleObject.

Все сложно, а как ты хотел.
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39734914
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
почему "... бесконечно ожидаем CommandEvent в WaitForSingleObject."?

Было всё нормально, приложение отлично работало, но просто было при закрытии сообщение от FastMM об утечке памяти:
Код: pascal
1.
2.
An unexpected memory leak has occurred. the unexpected small block leaks are:
69 - 76 bytes: TEventWaitThread x 1



Чтобы ликвидировать утечку, в
Код: pascal
1.
TFormMain.FormDestroy 


добавил в конце
Код: pascal
1.
FreeAndNil(Thread);


После этого при закрытии крестиком приложение визуально исчезает, но переходя из Приложения в Фоновые процессы (в Диспетчере задач) продолжает висеть в Фоновых процессах, не позволяя запустить приложение в следующий раз.

Может быть неправильно использовать
Код: pascal
1.
FreeAndNil(Thread);


для ликвидации утечки?

Тогда как ликвидировать утечку?
...
Рейтинг: 0 / 0
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
    #39735328
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAryМожет быть неправильно использовать
Код: pascal
1.
FreeAndNil(Thread);



для ликвидации утечки?
Правильно. Особенно, если FreeOnTerminate у потока убрать.
AdamAryТогда как ликвидировать утечку?
21737398
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]