最近项目的Demo开发使用Delphi 2010,其中使用了多线程开发技术
这里采用VCL的TThread类完成多线程开发,直接使用CreateThread的办法之前用过很多,这里就当练习,试试采用TThread类
TThread类类似VC中的CThread,主要是采用面向对象思想对CreateThread封装了一层,方便多线程的代码编写,线程执行所需要的相关参数可以很方便的设置,线程的操作和线程状态的获取也很方便。至于内部原理,有兴趣的话可以看看VCL源代码,这里就不深入探讨了。
所使用TThread完成多线程开发,可以按照如下步骤进行:
1。从TThread派生一个类,例如TxDerivedThread,并重载Execute函数,多线程的核心代码主要就在该函数中
2。如果在线程执行中需要设置相关执行参数,则可以在派生类TxDerivedThread中添加字段,并使外部调用者有办法修改,比如使用公共字段,设置Setter函数,或者公共Property。这些字段在Execute函数中是可以访问到的,这样就达到了对函数设置执行参数的目的。
但是因为在构造线程类对象时,线程默认会自动执行,而不会挂起,这样外界就没有了设置参数的时机,所以如果需要设置线程执行参数,则需要重载构造函数Create,在其中调用TThread的构造函数,并传递参数True,使线程创建后立即挂起,然后设置相关参数,最后再将线程Resume即可,这样外部就能够控制线程的创建了
例如如下的派生类:
TxKernelBuildThread = class(TThread)
private
main_form: HWND; // 主界面窗口句柄
procedure SetMainForm(value: HWND);
protected
procedure Execute; override;
。。。
public
property MainWnd: HWND write SetMainForm;
。。。
end;
constructor TxKernelBuildThread.Create(suspend: Boolean);
begin
inherited Create(suspend);
end;
在构造时调用者将suspend传递为True,这样线程在创建之初就会挂起,调用者就有机会设置参数了
例如如下的字段设置函数:
procedure TxKernelBuildThread.SetMainForm(value: HWND);
begin
if value = 0 then
begin
Exit;
end;
Self.main_form:=value;
end;
在线程创建之后,就可以设置相关的参数,并在线程执行过程中使用:
例如:
procedure TxKernelBuildThread.Execute;
var
fmt: UnicodeString;
params: UnicodeString;
ret: Integer;
begin
PostMessage(main_form,THREAD_INDEX_START,Self.id,0);
。。。
end;
这样就完成了线程执行参数的传递工作。
至于线程执行结果的获取,也可以采用类似的方法。
3。如果要控制线程的执行,比如挂起,恢复,终止;或者获取线程的状态,比如是否完成,是否挂起等,都有相关的封装函数。
操作函数:Suspend;Resume;Terminate;等
状态获取:ReturnValue;Terminated;Finished;Suspended;等
其他详细函数,可以查看CDN(类似于MSDN,Embarcadero确实比Borland勤快很多了,呵呵)
4。其他的线程同步操作,主要也就是临界区,互斥体,信号量等,这些就不讨论了,比较基本,以后有机会再补上吧。