让应用以单例运行
有时候我们会期望所编写的应用只运行一个实例,比如监听网络端口或串口,用Lazarus
有两种不同的实现方案。
SingleInstanceEnabled属性
SingleInstanceEnabled
是TCustomApplication
的属性,在初始化之前设置为True
即可轻松实现单实例应用:
program project1;
{$mode objfpc}{$H+}
uses
AdvancedSingleInstance, //注意:必须引用该单元!!!
Interfaces,
Forms,
...;
{$R *.res}
begin
Application.SingleInstanceEnabled := True; //注意:必须在调用 Initialize 前赋值!!!
Application.Initialize;
...
Application.Run;
end.
特别注意
-
必须引用
AdvancedSingleInstance
单元,且该单元必须在Interfaces
单元和Forms
单元前 -
必须在调用
Application.Initialize
前赋值 -
该方法仅针对
同一个
可执行文件生效,并非系统全局生效
互斥对象
利用操作系统的互斥对象
可实现系统级的单例
。
var
AppMutex: THandle;
begin
Application.Initialize;
if OpenMutex(MUTEX_ALL_ACCESS, False, PChar('唯一标识')) = 0 then
begin
AppMutex := CreateMutex(nil, False, PChar('唯一标识'));
...
Application.Run;
CloseHandle(AppMutex);
end
else
Application.Terminate;
end.
特别注意
唯一标识
必须唯一,否则,即使完全不同的应用也只能运行其中一个