powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Забивается оперативка
25 сообщений из 26, страница 1 из 2
Забивается оперативка
    #39541335
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Две формы
Первая

Код: 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.
unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton;

type
  TForm5 = class(TForm)
    sButton1: TsButton;
    procedure sButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

uses
  Unit1;

procedure TForm5.sButton1Click(Sender: TObject);
begin
  if sButton1.Tag = 0 then
  begin
    Form1 := TForm1.Create(Application);
    Form1.Show;
    sButton1.Tag := 1;
  end else
  begin
    sButton1.Tag := 0;
    Form1.Free;
  end;
end;

end.




вторая

Код: 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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, sPanel;

type
  TForm1 = class(TForm)
    Panel: TsPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT and (not WS_EX_APPWINDOW));
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopWindow);
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
end;

end.




У второй формы:
Align = alClient
AlphaBlend = true
AlphaBlend = 200
Color = clBlack
TransparentColor = true
TransparentColorValue = clFuchsia

На второй форме лежит панель:
Color = clFuchsia
BevelOuter = bvNone

Из первой формы нажимаю по кнопке несколько раз и вижу как забивается оперативка
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541336
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какой именно процесс забивает оперативку - без понятия. Точно не моя программа.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541338
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже процесс: Диспетчер окон рабочего стола
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541348
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Miracle9...Точно не моя программа.
1. dpr в студию
2. Для проверки убрать обработчи Form1
3. Убедиться в правильности использования глобальной переменной Form1 в первой форме
Form1 := TForm1.Create(Application);
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541350
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreedoomMiracle9...Точно не моя программа.
1. dpr в студию
2. Для проверки убрать обработчи Form1
3. Убедиться в правильности использования глобальной переменной Form1 в первой форме
Form1 := TForm1.Create(Application);

"1. dpr в студию"
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
program Project3;

uses
  Vcl.Forms,
  Unit5 in 'Unit5.pas' {Form5},
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm5, Form5);
  Application.Run;
end.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541351
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Miracle9, по п. 1 - Ок Form1 автоматически не создаётся. Осталось проверить остальное. Для гарантии блокировки повторного использования Form1 предлагаю сравнивать Form1 <> nil, а после Form1.Free добавить Form1 := nil
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541355
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoomа после Form1.Free добавить Form1 := nil
FreeAndNil всеж короче будет
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541356
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreedoomMiracle9, по п. 1 - Ок Form1 автоматически не создаётся. Осталось проверить остальное. Для гарантии блокировки повторного использования Form1 предлагаю сравнивать Form1 <> nil, а после Form1.Free добавить Form1 := nil
Сделал
первая форма

Код: 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.
unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton;

type
  TForm5 = class(TForm)
    sButton1: TsButton;
    procedure sButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

uses
  Unit1;

procedure TForm5.sButton1Click(Sender: TObject);
begin
  if sButton1.Tag = 0 then
  begin
    if (Form1 = nil) then
    begin
      Form1 := TForm1.Create(Application);
      Form1.Show;
      sButton1.Tag := 1;
      Self.Caption := Self.Caption + '1';
    end;
  end else
  begin
    sButton1.Tag := 0;
    Form1.Free;
    Form1 := nil;
  end;
end;

end.




все ровно грузиться
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541360
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9А какой именно процесс забивает оперативку - без понятия. Точно не моя программа.
Что за ерунда...
Диспетчер задач в разрезе процессов показывает кто сколько съел, при чем как физической, так и виртуальной и рабочей...
Монитор ресурсов показывает тоже самое
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541363
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. В MSDN
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633591(v=vs.85).aspx
авторYou must not call SetWindowLong with the GWL_HWNDPARENT index to change the parent of a child window. Instead, use the SetParent function.
т.к. она нигде не документирована, хотя и используется повсеместно самим майкрософтом.. но вдруг там чего еще нужно указывать..
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541364
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поменял
Код: pascal
1.
SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopWindow);


Все ровно грузиться.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541365
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не то написал
заменил на
Код: pascal
1.
Winapi.Windows.SetParent(Handle, GetDesktopWindow);


Продолжает грузить.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541366
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл в чём прикол:
У первой формы ставим TransparentColor = false и всё начинает работать нормально.
Версия делфи Delphi 10.1 Berlin
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541367
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДокFreeAndNil всеж короче будет
Да, но это вызов процедуры - небольшая потеря производительности. Когда присал про проверку Form1 на nil, подразумевал, следующую конструкцию:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
if Assigned(Form1) then begin
  Form1.Free; Form1 := nil;
end
else begin
  Form1 := TForm1.Create(Application);
  Form1.Show
end;



Miracle9 все ровно грузиться
Выполнить п.2 - убрать обработчики для TForm1 FormCreate и FormShow
В FormCreate, в отличии от FormShow, Handle может быть ещё не определён. Проверь скобки в GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT and (not WS_EX_APPWINDOW) В таком варианте выполняется
1 not
2 and
3 or
С учётом значений констант WS_EX* получится GetWindowLong() or WS_EX_TRANSPARENT
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541370
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom,

какая еще "производительность" в месте, где создаются/убиваются формы.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541372
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomДокFreeAndNil всеж короче будет
Да, но это вызов процедуры - небольшая потеря производительности
Вы издеваетесь? Она же inline
Код: pascal
1.
procedure FreeAndNil(var Obj); inline;
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541373
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще всё убрал из Form1
убрал FormCreate и FormShow.
Все ровно грузит.
В TransparentColor у Form1 ставлю true грузит ставлю false не грузит
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541374
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ FormCreate, в отличии от FormShow, Handle может быть ещё не определён.
Он определен в любом месте при обращении к Handle. Там Lazy Initialization
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TWinControl.HandleNeeded;
begin
  if WindowHandle = 0 then
  begin
    if Parent <> nil then Parent.HandleNeeded;
    CreateHandle;
  end;
end;

function TWinControl.GetHandle: HWND;
begin
  HandleNeeded;
  Result := WindowHandle;
end;



+ FormCreate вызывается уже в AfterConstruction (Если вы не мазохист с флагом OldCreateOrder) т.е. все конструкторы уже отработали, чему там еще инициализироваться...
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541375
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite, каюсь - отстал от последних версий
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541376
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9Вообще всё убрал из Form1
убрал FormCreate и FormShow.
Все ровно грузит.
В TransparentColor у Form1 ставлю true грузит ставлю false не грузит

TransparentColor всего лишь добавляет окну WS_EX_LAYERED и вызывает SetLayeredWindowAttributes
Больше там ничего нет.
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541404
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9Похоже процесс: Диспетчер окон рабочего стола
конечно DWM забивает, ты же указал прозрачность AlphaBlend = 200? кто-то же должен за неё "платить", так?

PS: уточнил бы что за винда, 7-ка?
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541605
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Miracle9Похоже процесс: Диспетчер окон рабочего стола
конечно DWM забивает, ты же указал прозрачность AlphaBlend = 200? кто-то же должен за неё "платить", так?

PS: уточнил бы что за винда, 7-ка?

10ка (версия 1709)
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541616
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

второй день с ней сижу, она мне уже не нравится
что то там серьёзно поменяли в DWM
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541689
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А знаете ещё в чём прикол, со временем, в Диспетчере Задач, этот процесс возвращается к 100мб (или даже меньше) занимаемой памяти, а общий процент занятой оперативки не снижается. А если закрыть какой нибудь файрфокс, то он снизиться (т.е.показатель % не заморожен).
...
Рейтинг: 0 / 0
Забивается оперативка
    #39541738
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

с нуля ставил систему или апдейтил?
по идее и фиг с ним сколько занимает DWM, это ж его проблемы
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Забивается оперативка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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