[线程问题]菜鸟提问线程的基本用法 ( 积分: 50 )

  • 主题发起人 主题发起人 lovefox
  • 开始时间 开始时间
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
、我知道TMsgThread.Create(True)这样可以创建一个线程,如果参数为true,线程创建但不执行。
否则,如果是false,创建并且执行线程。
2、FreeOnTerminate:=true;线程执行完毕以后就自动释放了
3、线程创建很消耗资源。所以如果定时要执行线程的代码,就不要把它释放。
基于以上的考虑,我对下面的代码是这样使用的。
{线程类定义}
TMsgThread = class(TThread)
private
{ Private declarations }
procedure ShowInMemo;
protected
procedure Execute;
override;
public

end;

procedure TWeather.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=false;//不释放
Synchronize(ShowInMemo);
end;

{主程序}
var
newThrd:TMsgThread;
procedure TForm1.Button1Click(Sender: TObject);
begin
newThrd:=TMsgThread.Create(True);
with newThrddo
begin
Resume;
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

newThrd.free;
//主窗体关闭的时候释放线程对象
end;

===================================
高手们,如上处理代码,应该符合规范吧。
 
、我知道TMsgThread.Create(True)这样可以创建一个线程,如果参数为true,线程创建但不执行。
否则,如果是false,创建并且执行线程。
2、FreeOnTerminate:=true;线程执行完毕以后就自动释放了
3、线程创建很消耗资源。所以如果定时要执行线程的代码,就不要把它释放。
基于以上的考虑,我对下面的代码是这样使用的。
{线程类定义}
TMsgThread = class(TThread)
private
{ Private declarations }
procedure ShowInMemo;
protected
procedure Execute;
override;
public

end;

procedure TWeather.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=false;//不释放
Synchronize(ShowInMemo);
end;

{主程序}
var
newThrd:TMsgThread;
procedure TForm1.Button1Click(Sender: TObject);
begin
newThrd:=TMsgThread.Create(True);
with newThrddo
begin
Resume;
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

newThrd.free;
//主窗体关闭的时候释放线程对象
end;

===================================
高手们,如上处理代码,应该符合规范吧。
 
麻子哥,进来看看嘛
 
这样用可行的.
设置 FreeOnTerminate:= True 这样不用管这个线程什么释放. 也行.
 
因为创建线程很耗资源,所以,如果执行完毕一次线程以后,如何再次执行这个线程呢?
再次唤醒么?
 
大家都在过圣诞节???????????????????
 
你这段代码button1点一次可以,点第二次,第一次的线程就不会在窗体关闭的时候释放!建议看看基础书籍。
 
哦,还有一点,如果你的button1如果一次都不点,关闭窗体后,会报错。
 
那如何写可以多次调用线程内的代码,又可以正确的释放资源哦
楼上大哥,指点啊。
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if newThrd <> nil then
newThrd:=TMsgThread.Create(True);
with newThrddo
begin
Resume;
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if newThrd <> nil
newThrd.free;
//主窗体关闭的时候释放线程对象
end;
改成这样就OK了。
 
那如果在释放线程前,要再次运行线程的代码,改如何写代码啊。
 
FreeOnTerminate:= True ;
这个要不要这样写啊。还是写FreeOnTerminate:= False;
 
圣诞快乐
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if newThrd <> nil then
//这里有没有错误啊。应该是newThrd = nil吧??、、、
newThrd:=TMsgThread.Create(True);
with newThrddo
begin
Resume;
end;

end;
 
恩,手误应该是
if newThrd = nil then
 
这个要不要这样写啊。还是写FreeOnTerminate:= True ;
 
这样写代码好像就是每次都创建线程哦。那和我最初的想法不一样哦
 
to zqw0117:
请进!!
 
会的,进来救救小弟啊~~~~~~~~~~~~~~~~~
 
var
newThrd:TMsgThread;
procedure TWeather.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=false;//不释放
while truedo
begin
Synchronize(ShowInMemo);
Suspend;
end ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
newThrd:=TMsgThread.Create(True);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
newThrd.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
newThrd.free;
//主窗体关闭的时候释放线程对象
end;
 
后退
顶部