ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:97KB ,
资源ID:6331895      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6331895.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文([Delphi]多线程编程(10)(11)多线程同步之 Mutex (互斥对象).doc)为本站会员(hskm5268)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

[Delphi]多线程编程(10)(11)多线程同步之 Mutex (互斥对象).doc

1、原理分析:互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用.其他线程可用 WaitForSingleObject 函数排队等候(等候也可以理解为排队申请).使用过程:var hMutex: THandle; 应该先声明一个全局的互斥句柄 CreateMutex 建立一个互斥对象WaitForSingleObject 用等待函数排队等候ReleaseMutex 释放拥有权CloseHandle 最后释放互斥对象ReleaseMutex、CloseHandle 的参数都是 CreateMutex

2、返回的句柄, 关键是 CreateMutex 函数 :function CreateMutex(lpMutexAttributes: PSecurityAttributes;bInitialOwner: BOOL; 是否让创建者(此例中是主线程)拥有该互斥对象lpName: PWideChar 可以给此互斥对象取个名字 , 如果不要名字可赋值为 nil): THandle;1、第一个参数前面说过 .2、第二个参数在这里一定要是 False, 如果让主线程拥有互斥 , 从理论上讲, 得等程序退出后其他线程才有机会;取值 False 时, 第一个执行的线程将会最先拥有互斥对象, 一旦拥有其他线程就

3、得先等等.3、第三个参数 , 如果给个名字 , 函数将从系统中寻找是否有重名的互斥对象, 如果有则返回同名对象的存在的句柄;如果赋值为 nil 将直接创建一个新的互斥对象; 下个例子将会有名字. 本例效果图:代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: T

4、Object);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation$R *.dfmvarf: Integer; 用这个变量协调一下各线程输出的位置hMutex: THandle; 互斥对象的句柄function MyThreadFun(p: Pointer): DWORD; stdcall;vari,y: Integer;beginInc(f);y := 20 * f;for i := 0 to 50000 dobegin

5、if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 thenbeginForm1.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);varThreadID: DWORD;beginRepa

6、int;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.FormCrea

7、te(Sender: TObject);beginhMutex := CreateMutex(nil, False, nil);end;procedure TForm1.FormDestroy(Sender: TObject);beginCloseHandle(hMutex);end;end.窗体文件: object Form1: TForm1Left = 0Top = 0Caption = Form1ClientHeight = 140ClientWidth = 192Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = cl

8、WindowTextFont.Height = -11Font.Name = TahomaFont.Style = OldCreateOrder = FalseOnCreate = FormCreatePixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 109Top = 107Width = 75Height = 25Caption = Button1TabOrder = 0OnClick = Button1ClickendendSyncObjs 单元下有封装好的 TMutex 类, 好像不如 Api 快, 内部机制也稍

9、有区别, 但使用方法差不多: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varFor

10、m1: TForm1;implementation$R *.dfmuses SyncObjs;varf: Integer;MyMutex: TMutex;function MyThreadFun(p: Pointer): DWORD; stdcall;vari,y: Integer;beginInc(f);y := 20 * f;for i := 0 to 50000 dobeginif MyMutex.WaitFor(INFINITE) = wrSignaled thenbeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20, y, IntToStr(i

11、);Form1.Canvas.Unlock;MyMutex.Release;end;end;Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);varThreadID: DWORD;beginRepaint;f := 0;CreateThread(nil, 0, MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, MyThreadFun, nil, 0, Thread

12、ID);CreateThread(nil, 0, MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, MyThreadFun, nil, 0, ThreadID);end;procedure TForm1.FormCreate(Sender: TObject);beginMyMutex := TMutex.Create(False);end;procedure TForm1.FormDestroy(Sender: TObject);beginMyMutex.Free;end;end.Mutex 作为系统核心对象是可以跨进程的( 临界区就不行

13、), 我们可以利用互斥对象禁止程序重复启动.工作思路:先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在;如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动;再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出 .最后在程序结束时用 CloseHandle 释放 Mutex 对象.function OpenMutex(dwDesiredAccess: DWORD; 打开权限bInheritHandle: BOOL; 能否被当前程序创建的进程继承pName: PWideChar

14、Mutex 对象的名称): THandle; stdcall; 成功返回 Mutex 的句柄; 失败返回 0注意, 这里的 CreateMutex 函数应该有个名了, 因为 OpenMutex 要用到;另外, CreateMutex 的第二个参数已经不重要了( 也就是 True 和 False 都行), 因为这里是用其名称来判断的.程序可以这样写: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;typeTForm1 = class

15、(TForm)procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation$R *.dfmvarhMutex: THandle;constNameMutex = MyMutex;procedure TForm1.FormCreate(Sender: TObject);beginif OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex) 0 thenbeginMessageBox(0, 该程序已启动, 提示, MB_OK);Application.Terminate;end;hMutex := CreateMutex(nil, False, NameMutex);Application.Initialize;Application.MainFormOnTaskbar := True;Application.CreateForm(TForm1, Form1);Application.Run;CloseHandle(hMutex);主线程出口 end.

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报