如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
delphi多线程编程2在这段程序中,有三个线程几乎是同时建立,向窗体中的ListBox1中写数据,最后写出的结果是这样的:能不能让它们别打架,一个完了另一个再来?这就要用到多线程的同步技术.前面说过,最简单的同步手段就是"临界区".先说这个"同步"(Synchronize),首先这个名字起的不好,我们好像需要的是"异步";其实异步也不准确...管它叫什么名字呢,它的目的就是保证不**、有次序、都发生."临界区"(CriticalSection):当把一段代码放入一个临界区,线程执行到临界区时就独占了,让其他也要执行此代码的线程先等等;这和前面用的Lock和UnLock差不多;使用格式如下:varCS:TRTLCriticalSection;{声明一个TRTLCriticalSection结构类型变量;它应该是全局的}InitializeCriticalSection(CS);{初始化}EnterCriticalSection(CS);{开始:轮到我了其他线程走开}LeaveCriticalSection(CS);{结束:其他线程可以来了}DeleteCriticalSection(CS);{删除:注意不能过早删除}//也可用TryEnterCriticalSection替代EnterCriticalSection.用上临界区,重写上面的代码,运行效果图:代码文件:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)ListBox1:TListBox;Button1:TButton;procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);procedureButton1Click(Sender:TObject);end;varForm1:TForm1;implementation{$R*.dfm}varCS:TRTLCriticalSection;functionMyThreadFun(p:Pointer):DWORD;stdcall;vari:Integer;beginEnterCriticalSection(CS);fori:=0to99doForm1.ListBox1.Items.Add(IntToStr(i));LeaveCriticalSection(CS);Result:=0;end;procedureTForm1.Button1Click(Sender:TObject);varID:DWORD;beginCreateThread(nil,0,@MyThreadFun,nil,0,ID);CreateThread(nil,0,@MyThreadFun,nil,0,ID);CreateThread(nil,0,@MyThreadFun,nil,0,ID);end;procedureTForm1.FormCreate(Sender:TObject);beginListBox1.Align:=alLeft;InitializeCriticalSection(CS);end;procedureTForm1.FormDestroy(Sender:TObject);beginDeleteCriticalSection(CS);end;end.Delphi在SyncObjs单元给封装了一个TCriticalSection类,用法差不多,代码如下:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)ListBox1:TListBox;Button1:TButton;procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);procedureButton1Click(Sender:TObject);end;varForm1:TForm1;implementation{$R*.dfm}usesSyncObjs;varCS:TCriticalSection;functionMyThreadFun(p:Pointer):DWORD;stdcall;vari:Integer;beginCS.Enter;fori:=0to99doForm1.ListBox