gpt4 book ai didi

delphi - 如何判断我的程序的另一个实例是否已经在运行?

转载 作者:行者123 更新时间:2023-12-03 14:33:33 34 4
gpt4 key购买 nike

我如何判断我的程序的一个实例是否正在运行?我以为我可以用数据文件来做到这一点,但它只会很困惑:(

我想这样做,因为我只希望在某个时刻打开 1 个实例。

最佳答案

正如乔恩首先建议的那样,您可以尝试创建互斥体。调用CreateMutex 。如果返回非空句柄,则调用 GetLastError 。它会告诉您是否是该互斥锁的创建者,或者该互斥锁之前是否已打开 (Error_Already_Exists)。请注意,不需要获取互斥体的所有权。互斥锁不用于互斥。它被使用是因为它是一个命名的内核对象。事件或信号量也可以起作用。

互斥技术给你一个 bool 答案:是的,还有另一个实例,或者不,没有。

您经常想了解的不仅仅是这些。例如,您可能想知道另一个实例的主窗口的句柄,以便您可以告诉它代替另一个实例进入前台。这就是内存映射文件可以派上用场的地方;它可以保存有关第一个实例的信息,以便后续实例可以引用它。

选择互斥锁的名称时要小心。仔细阅读文档,并记住某些字符(例如反斜杠)在某些操作系统版本中是不允许的,但在其他操作系统版本中某些功能是必需的。

还要记住其他用户的问题。如果您的程序可以通过远程桌面或快速用户切换来运行,那么可能有其他用户已经在运行您的程序,并且您可能并不真正希望限制当前用户运行您的程序。在这种情况下,不要使用全局名称。如果您确实想要限制所有用户的访问,那么请确保互斥对象的安全属性使得每个人都能够打开它的句柄。对 lpSecurityAttributes 参数使用空指针是不够的; MSDN 提到的“默认安全描述符”为当前用户提供了完全访问权限,而其他用户则没有访问权限。

您可以编辑程序的 DPR 文件。这通常是做此类事情的好地方。如果您等到其中一个窗体的 OnCreate 事件发生,那么您的程序已经有一点正常运行的动力,因此在此时尝试终止程序是很笨拙的。最好在完成太多 UI 工作之前终止。例如:

var
mutex: THandle;
mutexName: string;
begin
mutexName := ConstructMutexName();

mutex := CreateMutex(nil, False, PChar(mutexName));

if mutex = 0 then
RaiseLastOSError; // Couldn't open handle at all.

if GetLastError = Error_Already_Exists then begin
// We are not the first instance.
SendDataToPreviousInstance(...);
exit;
end;
// We are the first instance.

// Do NOT close the mutex handle here. It must
// remain open for the duration of your program,
// or else later instances won't be able to
// detect this instance.

Application.Initialize;
Application.CreateForm(...);
Application.Run;
end.

存在一个何时关闭互斥体句柄的问题。你不必关闭它。当您的进程最终终止时(即使它崩溃),操作系统将自动关闭任何未完成的句柄,并且当没有更多句柄打开时,互斥对象将被销毁(从而允许程序的另一个实例启动并认为自己是第一个例子)。

但是您可能还是想关闭该句柄。假设您选择实现我在代码中提到的 SendDataToPreviousInstance 函数。如果您想变得更有趣,那么您可以考虑前一个实例已经关闭并且无法接受新数据的情况。那么您就不会真正想要关闭第二个实例。第一个实例可以在知道它正在关闭时立即关闭互斥体句柄,实际上成为“跛脚鸭”实例。第二个实例将尝试创建互斥体句柄,成功,并认为自己是真正的第一个实例。前一个实例将不间断地关闭。使用CloseHandle关闭互斥锁;例如,从主窗体的 OnClose 事件处理程序或您调用 Application.Terminate 的其他位置调用它。

关于delphi - 如何判断我的程序的另一个实例是否已经在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/459554/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com