从其它平台迁移而来
在开发过程中,不可避免的要用到多线程,而线程的同步、释放等又可能引入新的问题,不过网上已有许多资料,这里重点说下我使用的方法。
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
|
type
TMyThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create(...);
destructor Destroy; override;
//使用 reintroduce 关键字可以明确通知编译器屏蔽父类的同名方法而使用自己的方法。
procedure Free; reintroduce;
end;
constructor TMyThread.Create(...);
begin
{ 在这里创建相关对象,可以省去先挂起线程再恢复的操作 }
inherited Create;
end;
destructor TMyThread.Destroy;
begin
{ 在这里释放相关资源 }
inherited Destroy;
end;
procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
{ 线程处理 }
Sleep(100); //根据实际情况设置
end;
end;
procedure TMyThread.Free;
begin
//终止线程
Terminate;
//等待线程结束
while not Finished do
Sleep(1);
end;
|
这样一来,就可以像普通类一样使用Free
来释放线程了,但是不能使用FreeAndNil
进行释放。
当然,一定要调用Free
才行。良好的编程习惯还是要有的!
2019-09-07#
最近又研究了一下安全结束线程的方法,又有一些新发现。
-
Delphi 2007
及以前是没有线程的Finished
属性的(好像是Delphi 2009
以后才有的,具体没有深究),以上方法无法使用。
-
线程自己的Free
方法其实是很完善的(用Delphi XE 10.3
,其它未测试),可以直接使用,但前提是不使用FreeOnTerminate := True;
,否则会调用两次Destroy
,肯定要报错了!如此看来,若坚持谁创建谁释放的原则,FreeOnTerminate := True;
根本没有用武之地。
-
既然Free
可以使用,FreeAndNil
自然也可以使用。