因此,我能够在 Windows 上强制执行应用程序的单个实例,如下所示。
[STAThread]
class method Program.Main(args: array of string);
begin
var mutex := new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
if mutex.WaitOne(Timespan.Zero, true) then
begin
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += OnThreadException;
lMainForm := new MainForm;
lMainForm.ShowInTaskbar := true;
lMainForm.Visible := false;
Application.Run(lMainForm);
end
else
MessageBox.Show("Another copy running!!!");
end;
但是,在单声道 Linux 上运行相同的应用程序时,此代码根本不起作用。我能够运行多个副本。我不知道这是否与我在终端上启动应用程序有关mono MyPro.exe
。如果这是问题所在,您是否需要在执行命令行之前传递一些值。
提前致谢,
正如 Adrian Faciu 提到的那样,您需要在单声道中启用共享内存才能使您的方法发挥作用,但这不是最好的方法(首先默认情况下禁用它是有原因的,即使我现在不记得确切的原因) 。
我过去使用过两种解决方案:
基于文件的锁。创建一个已知文件,将 pid 写入该文件。在应用程序启动时,检查该文件是否存在,如果存在,则读取 pid 并检查是否有任何正在运行的进程具有该 pid(以便它可以从崩溃中恢复)。并在退出时删除该文件(在首先创建它的实例中)。缺点是,如果几乎同时启动多个实例,则启动时会出现竞争条件。您可以通过文件锁定来改进这一点,但您可能必须使用 P/Invokes 在 Linux 上执行正确的文件锁定(我不完全确定托管 API 会执行您所期望的操作)。
基于 socked 的锁。打开已知端口。与上述相比的优点是您不需要进行任何清理,并且没有竞争条件。缺点是您需要一个固定/已知的端口,并且其他一些程序可能会同时使用该端口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)