Delphi多线程之Semaphore (信号对象)_第1页
Delphi多线程之Semaphore (信号对象)_第2页
Delphi多线程之Semaphore (信号对象)_第3页
Delphi多线程之Semaphore (信号对象)_第4页
Delphi多线程之Semaphore (信号对象)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Delphi 多线程之Semaphore (信号对象之前已经有了两种多线程的同步方法:CriticalSection(临界区 和Mutex(互斥, 这两种同步方法差不多, 只是作用域不同; CriticalSection(临界区 类似于只有一个蹲位的公共厕所, 只能一个个地进;Mutex(互斥 对象类似于接力赛中的接力棒, 某一时刻只能一个人持有, 谁拿着谁跑. 什么是Semaphore(信号或叫信号量 呢?譬如到银行办业务、或者到车站买票, 原来只有一个服务员, 不管有多少人排队等候, 业务只能一个个地来.假如增加了业务窗口, 可以同时受理几个业务呢?这就类似与Semaphore 对象, S

2、emaphore 可以同时处理等待函数(如:WaitForSingleObject 申请的几个线程.Semaphore 的工作思路如下:1、首先要通过CreateSemaphore(安全设置, 初始信号数, 信号总数, 信号名称 建立信号对象;参数四:和Mutex 一样, 它可以有个名称, 也可以没有, 本例就没有要名称(nil;有名称的一般用于跨进程.参数三:信号总数, 是Semaphore 最大处理能力, 就像银行一共有多少个业务窗口一样; 参数二:初始信号数, 这就像银行的业务窗口很多, 但打开了几个可不一定, 如果没打开和没有一样;参数一:安全设置和前面一样, 使用默认(nil即可.2

3、、要接受Semaphore 服务(或叫协调 的线程, 同样需要用等待函数(如:WaitForSingleObject 排队等候;3、当一个线程使用完一个信号, 应该用ReleaseSemaphore(信号句柄, 1, nil 让出可用信号给其他线程;参数三:一般是nil, 如果给个数字指针, 可以接受到此时(之前 总共闲置多少个信号; 参数二:一般是1, 表示增加一个可用信号;如果要增加CreateSemaphore 时的初始信号, 也可以通过ReleaseSemaphore.4、最后, 作为系统内核对象, 要用CloseHandle 关闭.另外, 在Semaphore 的总数是1的情况下,

4、就和Mutex(互斥 一样了.在本例中, 每点击按钮, 将建立一个信号总数为5的信号对象, 初始信号来自Edit1; 同时有5个线程去排队.本例也附上了Delphi 中TSemaphore 类的例子, 但没有过多地纠缠于细节, 是为了尽快理出多线程的整体思路.-本例效果图:-代码文件:-unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1=class(TFormButton1:TButton;Ed

5、it1:TEdit;procedure Button1Click(Sender:TObject;procedure FormCreate(Sender:TObject;procedure FormDestroy(Sender:TObject;procedure Edit1KeyPress(Sender:TObject; var Key:Char;end;varForm1:TForm1;implementation$R*.dfmvarf:Integer; 用这个变量协调一下各线程输出的位置hSemaphore:THandle; 信号对象的句柄function MyThreadFun(p:Poin

6、ter:DWORD; stdcall;vari,y:Integer;beginInc(f;y :=20*f;if WaitForSingleObject(hSemaphore,INFINITE =WAIT_OBJECT_0thenbeginfor i :=0to 1000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20,y, IntToStr(i;Form1.Canvas.Unlock;Sleep(1;以免Canvas 忙不过来end;end;ReleaseSemaphore(hSemaphore,1, nil;Result :=0;end;pr

7、ocedure TForm1.Button1Click(Sender:TObject;varThreadID:DWORD;begin不知是不是之前创建过Semaphore 对象, 假如有先关闭CloseHandle(hSemaphore;创建Semaphore 对象hSemaphore :=CreateSemaphore(nil,StrToInt(Edit1.Text,5, nil;Self.Repaint;f :=0;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0,

8、 ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;end;让Edit 只接受12345五个数procedure TForm1.Edit1KeyPress(Sender:TObject; var Key:Char;beginif not CharInSet(Key,'1'.'5'then Key :=#0

9、;end;procedure TForm1.FormCreate(Sender:TObject;beginEdit1.Text :='1'end;procedure TForm1.FormDestroy(Sender:TObject;beginCloseHandle(hSemaphore;end;end.-窗体文件:-object Form1:TForm1Left =0Top =0Caption ='Form1'ClientHeight =140ClientWidth =192Color =clBtnFaceFont.Charset =DEFAULT_CHARS

10、ETFont.Color =clWindowTextFont.Height =-11Font.Name ='Tahoma'Font.Style =OldCreateOrder =FalseOnCreate =FormCreatePixelsPerInch =96TextHeight =13object Button1:TButtonLeft =109Top =107Width =75Height =25Caption ='Button1'TabOrder =0OnClick =Button1Clickendobject Edit1:TEditLeft =109T

11、op =80Width =75Height =21TabOrder =1Text ='Edit1'OnKeyPress =Edit1KeyPressendend-再用SyncObjs 单元下的TSemaphore 类实现一次, 使用方法差不多, 运行效果也一样:-unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1=class(TFormButton1:TButton;Edit1:

12、TEdit;procedure Button1Click(Sender:TObject;procedure FormCreate(Sender:TObject;procedure FormDestroy(Sender:TObject;procedure Edit1KeyPress(Sender:TObject; var Key:Char;end;varForm1:TForm1;implementation$R*.dfmuses SyncObjs;varf:Integer;MySemaphore:TSemaphore;function MyThreadFun(p:Pointer:DWORD; s

13、tdcall;vari,y:Integer;beginInc(f;y :=20*f;if MySemaphore.WaitFor(INFINITE=wrSignaled then beginfor i :=0to 1000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20,y, IntToStr(i;Form1.Canvas.Unlock;Sleep(1;end;end;MySemaphore.Release;Result :=0;end;procedure TForm1.Button1Click(Sender:TObject;varThreadI

14、D:DWORD;beginif Assigned(MySemaphorethen MySemaphore.Free;MySemaphore :=TSemaphore.Create(nil,StrToInt(Edit1.Text,5, '' Self.Repaint;f :=0;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;CreateThread(nil,0, MyThreadFun,nil, 0, ThreadID;end;让Edit 只接受12345五个数procedure TForm1.Edit1KeyPress(Sender:TObject; var Key:Char; beginif not CharInSet(Key,'1'.'5'then

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论