Blue
Red
Green
Orange
Voilet
Slate
Dark

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

L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上:
如果再次点击按钮,线程代码还会执行一次???????
好像不会吧
 
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
你的button1肯定是可能点两次以上的对把?如果你只需要线程创建并执行一次,那你这样设计就没有意义了,因为这样设计的意图在于,创建线程后线程挂起,需要的时候点击button1让他执行一次,再需要再执行,程序退出再销毁线程占用的空间,可以避免每次点击button都创建并执行线程。如果你需要的只是一次,那么还不如就在button1里面创建他执行然后让他自动销毁,你觉得呢?
 
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
我的设计意图就是
[red]创建线程后线程挂起,需要的时候点击button1让他执行一次,再需要再执行,程序退出再销毁线程占用的空间[/red]
如果在线程代码里面FreeOnTerminate:= True ;那么每次按button1,还是要创建线程啊。对吧。因为你的if newThrd = nil then
总是成立,也就说线程对象总是为空啊。
 
P

pascal

Unregistered / Unconfirmed
GUEST, unregistred user!
如果再次点击按钮,线程代码还会执行一次!!!!!!!!!!!!!!!!
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
lovefox 你的线程是不是定时执行的哦?还是必须点击呢?
不管你是定时执行还是点击,我提供给你一个最简单的方法,
那就是waitfor******系列函数,而且保证你安全退出。
waitforsingalobject,waitformultipleobjects等等,
建议你找一本delphi深度历险看看,上面在waitfor*****系列函数
讲的比较详细。
 
P

pascal

Unregistered / Unconfirmed
GUEST, unregistred user!
在线程代码里面FreeOnTerminate:= True 只是设置个标志,
begin
{ Place thread code here }
FreeOnTerminate:=false;//不释放
while truedo
begin
Synchronize(ShowInMemo);
Suspend;
//在这里就停住等下一次Click了
end ;
end;
//执行本语句后才会Terminate,也才会Free,但本句永远也到不了
 
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
对,pascal的
FreeOnTerminate:=false;//不释放
你照做就对了。绝对不会重复创建的。
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
pascal的代码退出程序的时候怎么办呢?怎么样才可以安全的退出线程呢?
怎么样才能安全的释放资源呢?回答一下。
 
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
哈哈,看到了while 语句了。这下就好理解了。
那在窗体关闭的时候是否线程对象,应该可以安全退出吧。
 
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
to cqwty:
线程就是定时执行一下。都说创建线程比较耗资源。所以,我有了如上的想法哦。
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
所以你建立了就一直保留,对吧?我说的也是一样的,但是你上面说,看到while就可以安全退出,那是不可能的。为什么呢?可能你关闭窗体的时候,你的线程正在执行呢?对吧,那么这个时候绝对出错。还有,上面把freeonterminate设置为了false,也就是说,线程结束的时候,不主动释放资源,那这些资源你怎么处理呢?
 
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
所以啊,我特来求教各位大哥哦。
 
J

jeffrey_s

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TRepeatThread = class(TThread)
private
FButton: TButton;
public
constructor Create(AButton: TButton);
procedure UpdataCaption;
procedure Execute;
override;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
ButtonTread: TRepeatThread;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TRepeatThread.Create(AButton: TButton);
begin
FButton := AButton;
inherited Create(False);
end;

procedure TRepeatThread.Execute;
begin
FreeOnTerminate := True;
repeat
Synchronize(UpdataCaption);
Suspend;
if Terminated then
Break;
until false;
end;

procedure TRepeatThread.UpdataCaption;
begin
FButton.Caption := IntToStr(random(MaxInt));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ButtonTread = nil then
ButtonTread := TRepeatThread.Create(TButton(Sender))
else
// ButtonTread.Resume;
ButtonTread.Suspended := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if ButtonTread <> nil then
begin
ButtonTread.Terminate;
ButtonTread.Resume;
ButtonTread := nil;
end;
end;
// 简单就不多说了。
 
L

lovefox

Unregistered / Unconfirmed
GUEST, unregistred user!
分不多,大家海涵!
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
分多少无所谓,关键是大家都学到东西。哈哈
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
959
SUNSTONE的Delphi笔记
S
顶部 底部