Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы? / 22 сообщений из 22, страница 1 из 1
17.11.2018, 09:00
    #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
17.11.2018, 12:08
    #39734485
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
AdamAry,

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

можно попробовать еще множество костылей с нулевым результатом. а можно поискать, почему процесс виснет. например: запущенные, но не остановленные потоки.
...
Рейтинг: 0 / 0
17.11.2018, 12:25
    #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
17.11.2018, 12:31
    #39734499
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
AdamAry,

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

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

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

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

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

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

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

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

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

FreeOnTerminate := True;

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

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

FreeOnTerminate := True;

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

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

FreeOnTerminate := True;

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

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

FreeOnTerminate := True;

лучше убрать и самому разрушать.FreeOnTerminate := True; оправдан когда результат работы треда далее в программе не нужен.Надо сказать, редчайший случай, да и это единственное мнимое удобства элементарно решается без этого флага.
Зато еще этот флаг очень вреден, когда логика подразумевает возможность принудительной остановки (и/или перезапуска) этого потока.
А еще - при логике, которая подразумевает строгий порядок остановки потоков.
А еще - неизвестно, что с этим флагом будет при выгрузке dll.
Да много случаев, когда этот флаг будет только мешать.
...
Рейтинг: 0 / 0
18.11.2018, 10:36
    #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
18.11.2018, 13:51
    #39734782
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
AdamAryПочему собственно висим? Потому что бесконечно ожидаем CommandEvent в WaitForSingleObject. Что сделать? Установить CommandEvent (с помощью SetEvent)."

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

Все сложно, а как ты хотел.
...
Рейтинг: 0 / 0
19.11.2018, 06:54
    #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
19.11.2018, 21:01
    #39735328
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть из фонового процесса приложение, кочующего из Приложения в Фоновые процессы?
AdamAryМожет быть неправильно использовать
Код: pascal
1.
FreeAndNil(Thread);



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


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