Delphi多線程之Semaphore (信號(hào)對(duì)象)_第1頁(yè)
Delphi多線程之Semaphore (信號(hào)對(duì)象)_第2頁(yè)
Delphi多線程之Semaphore (信號(hào)對(duì)象)_第3頁(yè)
Delphi多線程之Semaphore (信號(hào)對(duì)象)_第4頁(yè)
Delphi多線程之Semaphore (信號(hào)對(duì)象)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Delphi 多線程之Semaphore (信號(hào)對(duì)象之前已經(jīng)有了兩種多線程的同步方法:CriticalSection(臨界區(qū) 和Mutex(互斥, 這兩種同步方法差不多, 只是作用域不同; CriticalSection(臨界區(qū) 類似于只有一個(gè)蹲位的公共廁所, 只能一個(gè)個(gè)地進(jìn);Mutex(互斥 對(duì)象類似于接力賽中的接力棒, 某一時(shí)刻只能一個(gè)人持有, 誰(shuí)拿著誰(shuí)跑. 什么是Semaphore(信號(hào)或叫信號(hào)量 呢?譬如到銀行辦業(yè)務(wù)、或者到車(chē)站買(mǎi)票, 原來(lái)只有一個(gè)服務(wù)員, 不管有多少人排隊(duì)等候, 業(yè)務(wù)只能一個(gè)個(gè)地來(lái).假如增加了業(yè)務(wù)窗口, 可以同時(shí)受理幾個(gè)業(yè)務(wù)呢?這就類似與Semaphore 對(duì)象, S

2、emaphore 可以同時(shí)處理等待函數(shù)(如:WaitForSingleObject 申請(qǐng)的幾個(gè)線程.Semaphore 的工作思路如下:1、首先要通過(guò)CreateSemaphore(安全設(shè)置, 初始信號(hào)數(shù), 信號(hào)總數(shù), 信號(hào)名稱 建立信號(hào)對(duì)象;參數(shù)四:和Mutex 一樣, 它可以有個(gè)名稱, 也可以沒(méi)有, 本例就沒(méi)有要名稱(nil;有名稱的一般用于跨進(jìn)程.參數(shù)三:信號(hào)總數(shù), 是Semaphore 最大處理能力, 就像銀行一共有多少個(gè)業(yè)務(wù)窗口一樣; 參數(shù)二:初始信號(hào)數(shù), 這就像銀行的業(yè)務(wù)窗口很多, 但打開(kāi)了幾個(gè)可不一定, 如果沒(méi)打開(kāi)和沒(méi)有一樣;參數(shù)一:安全設(shè)置和前面一樣, 使用默認(rèn)(nil即可.2

3、、要接受Semaphore 服務(wù)(或叫協(xié)調(diào) 的線程, 同樣需要用等待函數(shù)(如:WaitForSingleObject 排隊(duì)等候;3、當(dāng)一個(gè)線程使用完一個(gè)信號(hào), 應(yīng)該用ReleaseSemaphore(信號(hào)句柄, 1, nil 讓出可用信號(hào)給其他線程;參數(shù)三:一般是nil, 如果給個(gè)數(shù)字指針, 可以接受到此時(shí)(之前 總共閑置多少個(gè)信號(hào); 參數(shù)二:一般是1, 表示增加一個(gè)可用信號(hào);如果要增加CreateSemaphore 時(shí)的初始信號(hào), 也可以通過(guò)ReleaseSemaphore.4、最后, 作為系統(tǒng)內(nèi)核對(duì)象, 要用CloseHandle 關(guān)閉.另外, 在Semaphore 的總數(shù)是1的情況下,

4、就和Mutex(互斥 一樣了.在本例中, 每點(diǎn)擊按鈕, 將建立一個(gè)信號(hào)總數(shù)為5的信號(hào)對(duì)象, 初始信號(hào)來(lái)自Edit1; 同時(shí)有5個(gè)線程去排隊(duì).本例也附上了Delphi 中TSemaphore 類的例子, 但沒(méi)有過(guò)多地糾纏于細(xì)節(jié), 是為了盡快理出多線程的整體思路.-本例效果圖:-代碼文件:-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; 用這個(gè)變量協(xié)調(diào)一下各線程輸出的位置hSemaphore:THandle; 信號(hào)對(duì)象的句柄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 忙不過(guò)來(lái)end;end;ReleaseSemaphore(hSemaphore,1, nil;Result :=0;end;pr

7、ocedure TForm1.Button1Click(Sender:TObject;varThreadID:DWORD;begin不知是不是之前創(chuàng)建過(guò)Semaphore 對(duì)象, 假如有先關(guān)閉CloseHandle(hSemaphore;創(chuàng)建Semaphore 對(duì)象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五個(gè)數(shù)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 類實(shí)現(xiàn)一次, 使用方法差不多, 運(yùn)行效果也一樣:-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五個(gè)數(shù)procedure TForm1.Edit1KeyPress(Sender:TObject; var Key:Char; beginif not CharInSet(Key,'1'.'5'then

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論