gpt4 book ai didi

mono - 如何在单声道下强制应用程序的单实例?

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:51 24 4
gpt4 key购买 nike

因此,我可以在 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;

但是,在 Mono 下的 Linux 上运行相同的应用程序,此代码根本不起作用。我能够运行多个副本。我不知道这是否与我在终端上启动应用程序(例如 mono MyPro.exe)有关。如果这是问题所在,您是否需要在执行命令行之前传递一些值。

提前致谢,

最佳答案

正如 Adrian Faciu 提到的那样,您需要在 Mono 中启用共享内存才能使您的方法发挥作用,但这不是最好的方法(首先默认情况下禁用它是有原因的,即使我现在不记得确切的原因)。

我过去使用过两种解决方案:

  • 基于文件的锁。创建一个已知文件,将 pid 写入该文件。在应用程序启动时,检查该文件是否存在,如果存在,则读取 pid 并检查是否有任何正在运行的进程具有该 pid(以便它可以从崩溃中恢复)。并在退出时删除该文件(在首先创建它的实例中)。缺点是,如果几乎同时启动多个实例,则启动时会出现竞争条件。您可以通过文件锁定来改进这一点,但您可能必须使用 P/Invokes 在 Linux 上执行正确的文件锁定(我不完全确定托管 API 会执行您所期望的操作)。

  • 基于 socked 的锁。打开已知端口。与上述相比的优点是您不需要进行任何清理,并且没有竞争条件。缺点是您需要一个固定/已知的端口,并且其他一些程序可能会同时使用该端口。

关于mono - 如何在单声道下强制应用程序的单实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690285/

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