Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown / 24 сообщений из 24, страница 1 из 1
17.11.2018, 12:03
    #39734483
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
Добавили
Код: pascal
1.
ReportMemoryLeaksOnShutdown:=true;


в project1.drp, чтобы при выключении давал сообщения об утечке памяти
Вот при выключении программы начал давать сообщение:
Код: pascal
1.
2.
Аn unexpected memory leak has occurred. the unexpected small block leaks are:
69 - 76 bytes: TEventWaitThread x 1



Добавил для исключения утечки в конце
Код: pascal
1.
2.
3.
4.
TFormMain.FormDestroy(Sender: TObject);
...
FreeAndNil(Thread);
inherited;



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

Здесь
Код: pascal
1.
Thread := TEventWaitThread.Create(Handle);


создаётся в TFrmMain.FormCreate

Код: pascal
1.
TEventWaitThread = class(TThread) 


TEventWaitThread это класс TThread.

Чтобы приложение не уходило в фоновый процесс и закрывалось,
убрал
Код: pascal
1.
FreeAndNil(Thread);  и inherited;


и
добавил в конце
Код: pascal
1.
2.
3.
TFormMain.FormDestroy(Sender: TObject);
...
ExitProcess(0);


тогда всё нормально и сообщений об утечки нет, и приложение закрывается.

Возник вопрос:
не будет ли ExitProcess(0); подавлять необходимые сообщения об утечке памяти?
...
Рейтинг: 0 / 0
17.11.2018, 12:18
    #39734491
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAry,

важно исходить из простого:

ExitProcess, Application.Terminate, Halt в любом месте кода вызывается в особых случаях. скорее всего это не твои случаи. лучше не заниматься программированием методом псевдонаучного тыка, а точно разобраться, что где не так.
если что, место утечек тебе помогут найти: FastMM (FullDebugMode), EurekaLog, Mad Except.
...
Рейтинг: 0 / 0
17.11.2018, 12:28
    #39734496
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
makhaon,

FastMM (FullDebugMode) как раз и дал сообщение:
Код: pascal
1.
2.
Аn unexpected memory leak has occurred. the unexpected small block leaks are:
69 - 76 bytes: TEventWaitThread x 1



Как ликвидировать утечку памяти?
...
Рейтинг: 0 / 0
17.11.2018, 12:35
    #39734504
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAry,

очевидно, что нужно разрушить TEventWaitThread :)
...
Рейтинг: 0 / 0
17.11.2018, 12:44
    #39734511
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
makhaon,
как правильно разрушить TEventWaitThread?

Вот было написано до меня:

Код: pascal
1.
2.
type
  TEventWaitThread = class(TThread)



потом

Код: pascal
1.
2.
3.
TFormMain.FormCreate(Sender: TObject);
...
Thread := TEventWaitThread.Create(Handle);



потом
Код: pascal
1.
2.
3.
procedure [color=green]FreeEvent[/color];
begin
  [color=blue]Thread.Terminate[/color];



и в
Код: pascal
1.
2.
3.
4.
program ...
  if not Application.Terminated and not Thread.ExternalThread then
    [color=green]FreeEvent;[/color]
end.
...
Рейтинг: 0 / 0
17.11.2018, 13:38
    #39734521
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
А Thread.Free; где?
...
Рейтинг: 0 / 0
18.11.2018, 08:37
    #39734711
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,

в *.dpr файле проекта на последних строчках
Код: pascal
1.
2.
3.
4.
...
  if not Application.Terminated and not Thread.ExternalThread then
    FreeEvent;
end.



в uEventWaitThread.pas вот эта FreeEven процедура для завершения
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure FreeEvent;
begin
  Thread.Terminate;

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

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


и всё, т.е. получается для завершения не используется Thread.Free, используется Thread.Terminate
...
Рейтинг: 0 / 0
18.11.2018, 11:33
    #39734742
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
Thread.Terminate не делает Thread.Free.
...
Рейтинг: 0 / 0
18.11.2018, 12:05
    #39734751
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,
вместо Thread.Free делает это
Код: pascal
1.
FreeOnTerminate := True;


из
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
constructor TEventWaitThread.Create(const AWindow: HWND);
begin
  inherited Create(False);

  FreeOnTerminate := True;

  FWindow := AWindow;
end;
...
Рейтинг: 0 / 0
18.11.2018, 16:44
    #39734813
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
Ты уверен что у тебя Thread.Terminate приводит к завершению потока до закрытия приложения?
...
Рейтинг: 0 / 0
18.11.2018, 18:56
    #39734833
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAry,

А если ради эксперимента сделать так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure FreeEvent;
begin
  Thread.Terminate;

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

  // Закрываем все дескрипторы
  CloseHandle(CommandEvent);
  CloseHandle(ClientMailslotHandle);
  Thread.WaitFor;
end;
...
Рейтинг: 0 / 0
19.11.2018, 06:18
    #39734906
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,
'Ты уверен что у тебя Thread.Terminate приводит к завершению потока до закрытия приложения?'
не знаю,
разве не завершает поток до закрытия приложения?
...
Рейтинг: 0 / 0
19.11.2018, 06:23
    #39734908
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
alekcvp,
Not used.
XE6 help:
Currently, the WaitFor method is not used. It will always return wrError.
...
Рейтинг: 0 / 0
19.11.2018, 06:26
    #39734909
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAryне знаю,
разве не завершает поток до закрытия приложения?Он только вешает на тред флажок что пришла команда на его закрытие.

Этот флажок еще надо вручную в треде обработать и "штатно" заврешить тред.

Раз ты этого сам не делаешь значит тред у тебя и не останавливается и не освобождается.
...
Рейтинг: 0 / 0
19.11.2018, 06:28
    #39734910
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAryalekcvp,
Not used.
XE6 help:
Currently, the WaitFor method is not used. It will always return wrError.
Тогда:
WaitForSingleObject(Thread.Handle, INFINITE);
...
Рейтинг: 0 / 0
19.11.2018, 06:31
    #39734911
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,
попробовал
WaitForSingleObject(Thread.Handle, INFINITE);
не помогло, всё та же инфа от FastMM при закрытии об утечке памяти/
...
Рейтинг: 0 / 0
19.11.2018, 06:32
    #39734912
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,
как и где сделать?: "Этот флажок еще надо вручную в треде обработать и "штатно" заврешить тред."
...
Рейтинг: 0 / 0
19.11.2018, 06:55
    #39734915
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAry,

Читайте букварь.
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TMyThread.Execute;
begin
  while not Terminated do begin
    // тело "вечного" цикла
  end;
end;
...
Рейтинг: 0 / 0
19.11.2018, 07:08
    #39734919
AdamAry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
rgreat,
и что здесь не так?:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;
...
Рейтинг: 0 / 0
19.11.2018, 07:35
    #39734922
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
Отладку вам в руки.
...
Рейтинг: 0 / 0
19.11.2018, 13:39
    #39735124
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAry,

примитивнейший же случай. отладчик бери и смотри :) там всё просто замечательно видно будет. уже позавчера бы всё сделал, ну реально 20 строк кода же.
...
Рейтинг: 0 / 0
19.11.2018, 14:08
    #39735137
Гирлионайльдо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
Не вижу никаких утечек, кроме кривых рук
...
Рейтинг: 0 / 0
19.11.2018, 16:02
    #39735187
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
А чем обусловлена любовь к Winapi и OpenEvent вместо
TEvent или TLightweightEvent
...
Рейтинг: 0 / 0
19.11.2018, 16:35
    #39735218
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
AdamAryи что здесь не так?:Вызов Thread.Terminate установит свойству Terminated значение True. И все. Никакого завершения потока не произойдет. Вы в потоке должны сами проверять значения свойства Terminated и завершать поток.

Вы проверяете. Но только после выхода из функции WaitForSingleObject. Т.е. вам нужно еще и разбудить поток. С учетом того, что у вас установлено FreeOnTerminate = True это может оказаться не так просто, если объект CommandEvent уничтожается в деструкторе этого потока
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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