powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
24 сообщений из 24, страница 1 из 1
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734483
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавили
Код: 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
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734491
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAry,

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

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

очевидно, что нужно разрушить TEventWaitThread :)
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734511
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734521
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Thread.Free; где?
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734711
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734742
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread.Terminate не делает Thread.Free.
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734751
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734813
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты уверен что у тебя Thread.Terminate приводит к завершению потока до закрытия приложения?
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734833
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734906
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
'Ты уверен что у тебя Thread.Terminate приводит к завершению потока до закрытия приложения?'
не знаю,
разве не завершает поток до закрытия приложения?
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734908
AdamAry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,
Not used.
XE6 help:
Currently, the WaitFor method is not used. It will always return wrError.
...
Рейтинг: 0 / 0
Чтобы при выключении давал сообщения об утечке памяти включили ReportMemoryLeaksOnShutdown
    #39734909
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdamAryне знаю,
разве не завершает поток до закрытия приложения?Он только вешает на тред флажок что пришла команда на его закрытие.

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

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

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

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

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


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