资源描述:
《[Delphi]多线程编程(8)多线程同步之CriticalSection(临》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、先看一段程序,代码文件:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)ListBox1:TListBox;Button1:TButton;procedureFormCreate(Sender:TObject);procedureButton1Click(Sender:TObject);end;varFor
2、m1:TForm1;implementation{$R*.dfm}functionMyThreadFun(p:Pointer):DWORD;stdcall;vari:Integer;beginfori:=0to99doForm1.ListBox1.Items.Add(IntToStr(i));Result:=0;end;procedureTForm1.Button1Click(Sender:TObject);varID:DWORD;beginCreateThread(nil,0,@MyThreadFun,nil,0
3、,ID);CreateThread(nil,0,@MyThreadFun,nil,0,ID);CreateThread(nil,0,@MyThreadFun,nil,0,ID);end;procedureTForm1.FormCreate(Sender:TObject);beginListBox1.Align:=alLeft;end;end.窗体文件:objectForm1:TForm1Left=0Top=0Caption='Form1'ClientHeight=154ClientWidth=214Color=cl
4、BtnFaceFont.Charset=DEFAULT_CHARSETFont.Color=clWindowTextFont.Height=-11Font.Name='Tahoma'Font.Style=[]OldCreateOrder=FalseOnCreate=FormCreatePixelsPerInch=96TextHeight=13objectListBox1:TListBoxLeft=9Top=9Width=121Height=97ItemHeight=13TabOrder=0endobjectButt
5、on1:TButtonLeft=131Top=112Width=75Height=25Caption='Button1'TabOrder=1OnClick=Button1Clickendend在这段程序中,有三个线程几乎是同时建立,向窗体中的ListBox1中写数据,最后写出的结果是这样的:能不能让它们别打架,一个完了另一个再来?这就要用到多线程的同步技术.前面说过,最简单的同步手段就是"临界区".先说这个"同步"(Synchronize),首先这个名字起的不好,我们好像需要的是"异步";其实异步也不准确...管它
6、叫什么名字呢,它的目的就是保证不冲突、有次序、都发生."临界区"(CriticalSection):当把一段代码放入一个临界区,线程执行到临界区时就独占了,让其他也要执行此代码的线程先等等;这和前面用的Lock和UnLock差不多;使用格式如下:varCS:TRTLCriticalSection;{声明一个TRTLCriticalSection结构类型变量;它应该是全局的}InitializeCriticalSection(CS);{初始化}EnterCriticalSection(CS);{开始:轮到我了其他线程
7、走开}LeaveCriticalSection(CS);{结束:其他线程可以来了}DeleteCriticalSection(CS);{删除:注意不能过早删除}//也可用TryEnterCriticalSection替代EnterCriticalSection.用上临界区,重写上面的代码,运行效果图:代码文件:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtr
8、ls;typeTForm1=class(TForm)ListBox1:TListBox;Button1:TButton;procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);procedureButton1Click(Sender:TObject);end;varFo