博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程编程(11) - 多线程同步之 Mutex (互斥对象)[续]
阅读量:6823 次
发布时间:2019-06-26

本文共 1739 字,大约阅读时间需要 5 分钟。

  hot3.png

Mutex 作为系统核心对象是可以跨进程的(临界区就不行), 我们可以利用互斥对象禁止程序重复启动.
工作思路:
先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在;
如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动;
再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出.
最后在程序结束时用 CloseHandle 释放 Mutex 对象.
function OpenMutex(  dwDesiredAccess: DWORD; {打开权限}  bInheritHandle: BOOL;   {能否被当前程序创建的进程继承}  pName: PWideChar        {Mutex 对象的名称}): THandle; stdcall;      {成功返回 Mutex 的句柄; 失败返回 0}
注意, 这里的 CreateMutex 函数应该有个名了, 因为 OpenMutex 要用到;
另外, CreateMutex 的第二个参数已经不重要了(也就是 True 和 False 都行), 因为这里是用其名称来判断的.
程序可以这样写:

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs;type  TForm1 = class(TForm)    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);  end;var  Form1: TForm1;implementation{$R *.dfm}var  hMutex: THandle;const  NameMutex = 'MyMutex';procedure TForm1.FormCreate(Sender: TObject);begin  if OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex) <> 0 then  begin    ShowMessage('该程序已启动');    Application.Terminate;  end;  hMutex := CreateMutex(nil, False, NameMutex);end;procedure TForm1.FormDestroy(Sender: TObject);begin  CloseHandle(hMutex);end;end.
这一般都是写在 dpr 主程序里, 省得让后启动的程序执行些无用的代码:

program Project1;uses  Forms, Windows,  Unit1 in 'Unit1.pas' {Form1};{$R *.res}var  hMutex: THandle;const  NameMutex = 'MyMutex';begin  {主线程入口}  if OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex) <> 0 then  begin    MessageBox(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.

转载于:https://my.oschina.net/hermer/blog/320872

你可能感兴趣的文章
伍雨霏-懂游戏的云服务如何保驾护航
查看>>
姜正林-CIO职业规划点滴感受
查看>>
win8下获取注册表权限
查看>>
js笔试题2
查看>>
Custom TabBarController
查看>>
用Myeclipse创建PhoneGap应用程序
查看>>
Spring Cloud Alibaba基础教程:Nacos配置的多环境管理
查看>>
极乐小程序榜单(第六期)
查看>>
使用Log4j为项目配置日志输出应用详细总结及示例演示.
查看>>
Lua-5.3.2 安装 luasocket 的正确姿势
查看>>
freeswitch实战经验1:服务器向成员主动发起会议邀请
查看>>
python转换文本编码和windows换行符
查看>>
try-catch中导致全局变量无法变化的bug
查看>>
Js中数组的操作
查看>>
浏览器缓存 from memory cache与from disk cache详解
查看>>
php编译常用选项
查看>>
Docker Machine 简介
查看>>
Angular4错误提示的说明(一)
查看>>
CCNA+NP学习笔记—交换网络篇
查看>>
一张图说明Linux启动过程
查看>>