1

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

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

正因为如此,我认为QtSingleApplication行不通。

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

有 QMutex,它只用于应用程序的线程。

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

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

4

2 回答 2

0

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

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

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

于 2013-02-18T09:27:07.187 回答
0

你绝对可以用QtSingleApplication. 如果应用程序已经在运行,则没有任何义务要求您终止。您可以在提供的内容之上定义引导协议QtSingleApplication,即您将其 api 用作锁定原语

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

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

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

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

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

已经是互斥体了。

于 2013-02-18T09:46:04.150 回答