delphi - 释放在同一应用程序中启动时创建的互斥锁
问题描述
我在我的应用程序开始时创建了一个互斥锁,主要是为了防止运行同一应用程序的 2 个实例。
if CreateMutex(nil,false,'Proton Studio') = 0 then
RaiseLastOSError;
if GetLastError = ERROR_ALREADY_EXISTS then exit;
但是,当我重新配置我的应用程序时,我需要在应用程序关闭之前释放互斥锁,以便启动一个短程序,然后重新启动我的应用程序。
hw := OpenMutex(MUTEX_ALL_ACCESS, false, 'Proton Studio');
if ReleaseMutex(hw)then begin
if ShellExecute(application.Handle, 'open',
Pchar('StudioRestart.exe'), PChar(Application.ExeName),'', SW_SHOWNORMAL) > 32 then
fmIDEMain.Close
else
ShowMessage('Unable to Restart, please close and restart manually')
end
OpenMutex 返回一个句柄,但是当我调用 ReleaseMutex 时,该函数返回 false。我应该如何关闭这个互斥锁?
解决方案
您似乎使用互斥锁的存在作为标准来决定进程是否已经运行而不是谁拥有互斥锁。ReleaseMutex
如果您当前拥有互斥锁,则用于放弃对互斥锁的所有权。但是您的代码实际上并没有在任何地方检索互斥锁的所有权。
我看到了解决您问题的这些方法:
- 销毁互斥体而不是试图释放它。
而不是使用ReleaseMutex
,使用CloseHandle
来破坏互斥锁。如果你是唯一一个持有互斥锁句柄的人,那么它之后就会消失。
为此,请记住返回的原始句柄CreateMutex
,不要再次打开互斥锁。
- 按预期使用互斥锁
不要仅仅使用互斥体的存在,而是尝试通过调用WaitForSingleObject
它来获得所有权。然后你可以通过调用来释放它ReleaseMutex
。
- 外部程序应该等待(我的首选方法)
在尝试启动新实例之前,让外部程序等到应用程序的旧实例完全终止。
推荐阅读
- sql - 比较不同数据类型的日期
- oracle - 在 Oracle 中,我想创建一个“路由接口”,它根据参数插入到单独的表中
- excel - 获得#价值!工作表上的错误,但 VBA 测试子返回它应该返回的内容
- amazon-web-services - 如何在 AWS sagemaker 中运行预训练模型?
- javascript - 如何检测用户当前使用的推送通知设备?
- react-native - 无法加载脚本。请确保您正在运行 Metro 服务器(运行“react-native start”)或您的捆绑包
- javascript - Ext JS 编码 base64 图像设置为背景 url
- amazon-web-services - 我可以配置我的 .ssh/config 文件以使用我的 aws pem 文件作为所有 ec2 连接的默认值吗
- python - KNN 模型返回与任何 k 相同的距离
- javascript - 未捕获的类型错误:无法使用 JSON 读取未定义的属性“0”