Qt中系统范围的互斥锁

时间:2013-02-18 09:15:23

标签: qt mutex

我有一个进程,我想检查它是否正在运行,并在那个方向做出决定,即,我想从另一个实例检查此应用程序的运行实例。 / p>

我可以运行2个应用程序实例,处理2种类型的数据。当第三个实例打开时,它需要检查其类型的另一个实例(来自已创建的两种类型)是否已在运行。如果是这样,新的需要关闭并向已经运行的类型实例发送消息。

因此,我认为QtSingleApplication不起作用。

我希望创建一个系统范围的互斥锁并以这种方式进行检查,但我在Qt中没有看到任何系统范围的互斥锁。

有QMutex,仅适用于应用程序的线程。

当我在线搜索时,还有一些名为QSystemMutex的东西,但我想这是一个自定义解决方案?我没有在我的Qt安装或助手中找到它。

那么有什么方法可以使用Qt创建系统范围的互斥锁吗?

2 个答案:

答案 0 :(得分:0)

互斥锁被定义为在一个进程中用作对象。您正在寻找解决方案之外的解决方案。

一个简单的解决方案是使用文件系统。创建一个文件并在进程停止时将其删除。但是,当从不同目录运行多个进程或应用程序崩溃时,这可能会更难。

更高级的解决方案是使用共享内存对象。这些对象存在于进程外部,可以从任何进程检查和修改。关于QT共享内存的示例可以在这里找到:
http://doc.qt.digia.com/4.7-snapshot/ipc-sharedmemory.html

答案 1 :(得分:0)

你绝对可以用QtSingleApplication做到这一点。如果应用程序已在运行,则无需终止。您可以在QtSingleApplication为您提供的基础上定义引导协议,即您将其api用作锁定原语

您可以做的是将具有特定类型的消息发送到正在运行的实例,例如该类型的字符串表示形式。这很简单:您向正在运行的实例发送消息,并告诉您是否欢迎您。

  • 每次应用程序启动时,它都会监听消息(即使有一个正在运行)。如果类型不同,他只能收到一条消息。
  • 如果没有应用程序运行,他会直接去做他的工作。
  • 如果有应用程序正在运行,他会发送 hello消息(例如他的类型)并等待ACK,NACK或超时。如果超时,你决定该怎么办。
  • 如果您正在等待回复并收到 hello ,则拒绝。

ps:你所描述的并不完全是互斥体。以下代码

int main(int argc, char **argv) {
   QtSingleApplication app(argc, argv);

   if (app.isRunning())
       return 0;
   //blah blah blah
}

已经是互斥锁。