åçåæ:
äºæ¥å¯¹è±¡æ¯ç³»ç»å æ ¸å¯¹è±¡, å线ç¨é½å¯ä»¥æ¥æå®, è°æ¥æè°å°±è½æ§è¡;
æ§è¡å®æ¯, ç¨ ReleaseMutex å½æ°éæ¾æ¥ææ, ä»¥è®©å ¶ä»çå¾ ç线ç¨ä½¿ç¨.
å ¶ä»çº¿ç¨å¯ç¨ WaitForSingleObject å½æ°æéçå(çåä¹å¯ä»¥ç解为æéç³è¯·).
使ç¨è¿ç¨:
var hMutex: THandle; {åºè¯¥å
声æä¸ä¸ªå
¨å±çäºæ¥å¥æ}
CreateMutex {建ç«ä¸ä¸ªäºæ¥å¯¹è±¡}
WaitForSingleObject {ç¨çå¾
å½æ°æéçå}
ReleaseMutex {éæ¾æ¥ææ}
CloseHandle {æåéæ¾äºæ¥å¯¹è±¡}
ReleaseMutexãCloseHandle çåæ°é½æ¯ CreateMutex è¿åçå¥æ, å ³é®æ¯ CreateMutex å½æ°:
function CreateMutex(
lpMutexAttributes: PSecurityAttributes;
bInitialOwner: BOOL; {æ¯å¦è®©å建è
(æ¤ä¾ä¸æ¯ä¸»çº¿ç¨)æ¥æ该äºæ¥å¯¹è±¡}
lpName: PWideChar {å¯ä»¥ç»æ¤äºæ¥å¯¹è±¡å个åå, å¦æä¸è¦ååå¯èµå¼ä¸º nil}
): THandle;
{
1ã第ä¸ä¸ªåæ°åé¢è¯´è¿.
2ã第äºä¸ªåæ°å¨è¿éä¸å®è¦æ¯ False, å¦æ让主线ç¨æ¥æäºæ¥, ä»ç论ä¸è®², å¾çç¨åºéåºåå
¶ä»çº¿ç¨æææºä¼;
åå¼ False æ¶, 第ä¸ä¸ªæ§è¡ç线ç¨å°ä¼æå
æ¥æäºæ¥å¯¹è±¡, ä¸æ¦æ¥æå
¶ä»çº¿ç¨å°±å¾å
çç.
3ã第ä¸ä¸ªåæ°, å¦æç»ä¸ªåå, å½æ°å°ä»ç³»ç»ä¸å¯»æ¾æ¯å¦æéåçäºæ¥å¯¹è±¡, å¦ææåè¿ååå对象çåå¨çå¥æ;
å¦æèµå¼ä¸º nil å°ç´æ¥å建ä¸ä¸ªæ°çäºæ¥å¯¹è±¡; ä¸ä¸ªä¾åå°ä¼æåå. }
æ¬ä¾ææå¾:
代ç æ件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
f: Integer; {ç¨è¿ä¸ªåéåè°ä¸ä¸å线ç¨è¾åºçä½ç½®}
hMutex: THandle; {äºæ¥å¯¹è±¡çå¥æ}
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i,y: Integer;
begin
Inc(f);
y := 20 * f;
for i := 0 to 50000 do
begin
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(20, y, IntToStr(i));
Form1.Canvas.Unlock;
Sleep(0); {ç¨ç¨è½æä¸ç¹, ä¸ç¶ææ¶ Canvas ä¼åè°ä¸è¿æ¥}
ReleaseMutex(hMutex);
end;
end;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID: DWORD;
begin
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;
procedure TForm1.FormCreate(Sender: TObject);
begin
hMutex := CreateMutex(nil, False, nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(hMutex);
end;
end.
çªä½æ件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 140
ClientWidth = 192
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 109
Top = 107
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
SyncObjs åå ä¸æå°è£ 好ç TMutex ç±», 好åä¸å¦ Api å¿«, å é¨æºå¶ä¹ç¨æåºå«, ä½ä½¿ç¨æ¹æ³å·®ä¸å¤:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SyncObjs;
var
f: Integer;
MyMutex: TMutex;
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i,y: Integer;
begin
Inc(f);
y := 20 * f;
for i := 0 to 50000 do
begin
if MyMutex.WaitFor(INFINITE) = wrSignaled then
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(20, y, IntToStr(i));
Form1.Canvas.Unlock;
MyMutex.Release;
end;
end;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID: DWORD;
begin
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;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyMutex := TMutex.Create(False);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyMutex.Free;
end;
end.
转å¸ï¼http://www.cnblogs.com/del/archive/2009/02/13/1390295.html?login=1
Â