Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在Mac上运行单实例应用程序的理想方式_Cocoa_Macos_Mutex - Fatal编程技术网

Cocoa 在Mac上运行单实例应用程序的理想方式

Cocoa 在Mac上运行单实例应用程序的理想方式,cocoa,macos,mutex,Cocoa,Macos,Mutex,在Windows上,通常的做法是创建一个命名互斥体,并使用该互斥体的存在来确定给定应用程序的实例是否已在运行。这有它的缺点,但大部分是有效的 我可以想出一种在Mac上实现这一点的方法: 命名pthread互斥体 枚举正在运行的进程并查找匹配的进程 创建并锁定文件 可可粉/碳纤维中是否有比上述选项更容易的成分?如果不是,这三个选项中哪一个在mac上使用最多?我会假设2或3 Mac不像Windows那样有实例。一般来说,您希望应用程序运行两次—您需要复制二进制文件,然后双击复制的版本 如果您需要运行

在Windows上,通常的做法是创建一个命名互斥体,并使用该互斥体的存在来确定给定应用程序的实例是否已在运行。这有它的缺点,但大部分是有效的

我可以想出一种在Mac上实现这一点的方法:

  • 命名pthread互斥体
  • 枚举正在运行的进程并查找匹配的进程
  • 创建并锁定文件

  • 可可粉/碳纤维中是否有比上述选项更容易的成分?如果不是,这三个选项中哪一个在mac上使用最多?我会假设2或3

    Mac不像Windows那样有实例。一般来说,您希望应用程序运行两次—您需要复制二进制文件,然后双击复制的版本

    如果您需要运行两个应用程序实例,那么您的思维方式就不像Mac用户:)


    编辑:这在技术上是不正确的。检查注释。

    在不同的操作系统之间映射流程管理不起作用。或者工作不好。默认情况下,无需特别努力,您就可以获得应用程序的一个副本,而且只有一个副本

    这里有一个类似的问题,比当前的问题更进一步,其中一些回答讨论了当一个图像有多个副本或多个需要协调的应用程序时的联锁问题

    有关运行时上下文的介绍,尤其是有关Mac OS X守护进程和代理的介绍(对于确实需要以池或类似于Apache的方式运行可执行文件的多个副本的情况),请参阅:


    如果您正在编写Cocoa应用程序,可以使用NSWorkspace查看是否有另一个进程正在使用您的包标识符运行。我看到一些应用程序显示了一个对话框,并说:“这个应用程序的一个实例已经在运行”——我认为Firefox确实做到了


    这不是一个非常“mac-ish”的方法,但它将完成工作

    进一步阐述如何使用NSWorkspace。尝试在NSWorkspace中使用LaunchedApplication。这将返回一个NSArray,其中包含每个已启动应用程序的字典。您可以在阵列中循环,查看您正在查找的应用程序是否已在运行。我建议您将该值与键NSApplicationBundleIdentifier一起使用,该键的值类似于“com.mycompany.myapp”,而不是查找名称。如果需要查找应用程序的捆绑包标识符,可以查看应用程序包中的info.plist文件。

    如果要使用Java Web Start(JWS)部署应用程序,可以使用。JWS资源调配还将提供自动程序更新

    以下代码可用于已在运行的具有相同捆绑包标识符的退出应用程序

    执行此操作后,它还会显示警报

    AppDelegate.applicationdFinishLaunching

    let runningApp=
    NSWorkspace.shared.runningApplications
    .filter{item.bundleIdentifier==Bundle.main.bundleIdentifier}中的项
    .first{item.processIdentifier!=getpid()中的项]
    如果让running=runningApp{
    正在运行。forceTerminate()
    let alert=NSAlert()
    alert.messageText=“应用程序一直在运行”
    alert.informativeText=“应用程序已终止。”
    alert.alertStyle=NSAlert.Style.information
    alert.addButton(标题为“OK”)
    alert.runModal()
    }
    

    注意:这假设只有一个应用程序已经在运行。适应其他场景应该很简单。

    看看应用程序是如何启动和交互的,我认为不可能有多个实例。。。至少不是把应用程序捆绑成一个漂亮的应用程序。我在我的问题上有点作弊。。。我真的很想运行一个做了大量验证的测试应用程序,但是在应用程序运行时启动它会导致误报。为了不浪费时间寻找无用的问题,我希望测试应用程序在运行时出现错误。在windows上,我使用单实例方法解决了这个问题,并假设我希望对mac也这样做。[使用NSRunningApplication检测具有相同bundleID的应用程序是否正在运行,激活它并关闭启动的程序。][1][1]:换句话说,如果我们讨论的是GUI应用程序,则没有必要这样做。已经是这样了,不是这样的。例如,如果从终端启动应用程序,则可以同时启动N个实例。这是不寻常的事实并不意味着不应该考虑这个案例。我甚至会给你一个简单的例子,我相信这是一个非常常见的例子:从安装程序的postinstall启动应用程序。如果你搜索应用程序并从Spotlight启动,second instance会亮起。这是我想做的,但我的测试应用程序不是Cocoa应用程序(请参阅上面我的Q中的更新评论)。我发现碳中的GetNextProcess()可能会有所帮助。。还有其他建议吗?这是我想做的,但我的测试应用程序不是Cocoa应用程序(见上面我Q中的更新评论)。我发现碳中的GetNextProcess()可能会有所帮助。。还有其他建议吗?如果你是一个碳应用程序,那就是这样做的。你已经和碳库联系起来了吗?然而,同样的单实例功能也适用于Carbon应用程序。听起来您可能正在构建一个unix命令行程序,对吗?请注意,
    NSWorkspace-launchedApplications
    在Mac OS X 10.7中被贬低了。苹果建议您现在使用
    NSWorkspace-runningApplications
    (10.6+):