主线程:
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
procedure My(var m:TMessage);message WM_My;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.My(var m:TMessage);//message WM_My;
var pp:PMyRec;
begin
if m.WParam=0 then
begin
pp:=PMyRec(m.LParam);
// Memo1.Lines.Add(inttostr(pp.i));
FreeMem(pp,sizeof(TMyRec));
end
else if m.WParam=1 then
begin
Memo1.Lines.Add('TABthread finish .');
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var j:HWND;
begin
TABthread.Create(form1.Handle);
end;end.
子线程:
unit ABThreadU;interfaceuses
Classes, Messages, Windows;Const
WM_My=WM_USER+1000;type
TMyRec=record
i:integer;
end;
PMyRec=^TMyRec; TABthread = class(TThread)
private
FWnd:HWND;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(H:HWND);
end;implementationconstructor TABthread.Create(H:HWND);
begin
inherited Create(true);
FWnd:=H;
self.Resume;
end; procedure TABthread.Execute;
var pp:PMyRec;
i:integer;
begin
for i:=1 to 20000 do
begin
GetMem(pp,sizeof(TMyRec));
pp.i:=i;
PostMessage(FWnd,WM_My,0,integer(pp));
end;
PostMessage(FWnd,WM_My,1,0);
end;end.如上代码,每次按下 Button1 时,程序占用内存就增加 几十 到 上百k ,且“PostMessage(FWnd,WM_My,1,0);”不一定能收到。--------①
后来 将循环 减少为 “for i:=1 to 200 do”,第一次按 Button1 时,程序占内存增加了 几十k------②,接着 连续按 Button1 几十次,程序占内存都不会变。综上现象:
问题:
1、①处,是因为 连续发的消息 太多,窗口消息队列 放不下了?那 窗口消息队列 最多放多少条消息?
2、②处,为什么第一次按 Button1 时,程序占内存会增加 几十k?是因为第一次使用Memo1(打印“TABthread finish .”),程序为Memo1分配所需内存?(我程序刚打开时,Memo1里面是没有任何字符的)
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
procedure My(var m:TMessage);message WM_My;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.My(var m:TMessage);//message WM_My;
var pp:PMyRec;
begin
if m.WParam=0 then
begin
pp:=PMyRec(m.LParam);
// Memo1.Lines.Add(inttostr(pp.i));
FreeMem(pp,sizeof(TMyRec));
end
else if m.WParam=1 then
begin
Memo1.Lines.Add('TABthread finish .');
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var j:HWND;
begin
TABthread.Create(form1.Handle);
end;end.
子线程:
unit ABThreadU;interfaceuses
Classes, Messages, Windows;Const
WM_My=WM_USER+1000;type
TMyRec=record
i:integer;
end;
PMyRec=^TMyRec; TABthread = class(TThread)
private
FWnd:HWND;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(H:HWND);
end;implementationconstructor TABthread.Create(H:HWND);
begin
inherited Create(true);
FWnd:=H;
self.Resume;
end; procedure TABthread.Execute;
var pp:PMyRec;
i:integer;
begin
for i:=1 to 20000 do
begin
GetMem(pp,sizeof(TMyRec));
pp.i:=i;
PostMessage(FWnd,WM_My,0,integer(pp));
end;
PostMessage(FWnd,WM_My,1,0);
end;end.如上代码,每次按下 Button1 时,程序占用内存就增加 几十 到 上百k ,且“PostMessage(FWnd,WM_My,1,0);”不一定能收到。--------①
后来 将循环 减少为 “for i:=1 to 200 do”,第一次按 Button1 时,程序占内存增加了 几十k------②,接着 连续按 Button1 几十次,程序占内存都不会变。综上现象:
问题:
1、①处,是因为 连续发的消息 太多,窗口消息队列 放不下了?那 窗口消息队列 最多放多少条消息?
2、②处,为什么第一次按 Button1 时,程序占内存会增加 几十k?是因为第一次使用Memo1(打印“TABthread finish .”),程序为Memo1分配所需内存?(我程序刚打开时,Memo1里面是没有任何字符的)
解决方案 »
- Delphi 10当中如何安装OCX控件
- 博君一笑--雅典奥运记者主持人妙语大观『转帖』
- 讨论--intraweb是否适合数据库开发
- 与sql server 2000连接问题
- 讨论!!Delphi+MSSQL的程序如何发布最好!来者有分!(每人20)不够了再加!
- 请问屏幕保护退出的触发事件怎么找?
- 如何防止输入同样的编号到数据库中(100分)
- TStringList.objects[Index] 考贝数据问题
- 用全局钩子拦截已知标题窗口(提供C++实现代码,请帮转为DELPHI代码即可)
- 如何把圖像文件寫入sql-server資料庫﹖
- 给定一个圆心,如何画出同心圆。犹如圆型雷达一样!
- 如何修改html文件内容?
2、创建线程需要为线程分配栈空间。估计你查看的是物理内存,对于重复的操作,多数情况下再第1次执行时物理内存会增加,之后就基本不变了。如果是虚拟内存,是在分配是增加,释放后减少。
var pp:PMyRec;
i:integer;
begin
FreeOnTerminate := True; // <-- 线程完了后释放
你的意思是:如果 我 第一次 按下 Button1 时,物理内存 够用,则 任务管理器 中的数值增加,并在线程TABthread执行完后数值不减少;又 如果 我 第一次 按下 Button1 时,物理内存不够,要用到虚拟内存,则 任务管理器 中的数值增加,并在线程TABthread执行完后数值减少。
是不是?
end;
PostMessage(FWnd,WM_My,1,0);
请教一下楼主,这两句在线程的作用是什么?