[Delphi]多线程编程(8)多线程同步之CriticalSection(临

[Delphi]多线程编程(8)多线程同步之CriticalSection(临

ID:47162245

大小:95.50 KB

页数:8页

时间:2019-08-14

[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第1页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第2页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第3页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第4页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第5页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第6页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第7页
[Delphi]多线程编程(8)多线程同步之CriticalSection(临_第8页
资源描述:

《[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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。