【问题标题】:How to force my application to be single process by QsystemSemphore? Qt, Linux [duplicate]如何通过 QsystemSemphore 强制我的应用程序成为单个进程? Qt,Linux [重复]
【发布时间】:2010-11-04 10:19:01
【问题描述】:

可能重复:
How to force my application to open one exe only? qt, linux

嗨,

我想强制我的应用程序只打开一个 exe,QsystemSemaphore 怎么做? 即如果过程

10 倍!

【问题讨论】:

  • 为什么需要使用QSystemSemaphore?为什么不使用QSingleApplication
  • 我不想使用这个类。
  • -1 嘿朋友,你为什么不接受或编辑你现有的问题(与这个问题非常相似),然后再开始一个几乎相同的新问题??? stackoverflow.com/questions/4087235/…
  • 抱歉,但我希望所有用户都能看到我的问题 - 并且类型不一样 :-(
  • 我用 QSystemSemaphore 而不是 QSharedMemory 更新了对您原始问题的回复,几乎相同。让我知道它是否有效。

标签: linux qt process


【解决方案1】:

我不认为使用 QSystemSemaphore 可以轻松解决。据我所知,这个类只支持阻塞锁尝试。这似乎是那里的重点:您只能调用 release(总是成功但不会告诉您任何事情)或 acquire(它只会告诉您通过永远阻止您达到极限):

如果一个实例创建了一个信号量,它不会知道它是真的创建了它还是使用了现有的。如果它是获取时的二进制信号量,则可能会发生两件事。它要么获得锁,这意味着它是第一个也是唯一的实例,要么它只是阻塞在那里直到第一个实例退出。

要绕过该问题,您可以将该测试放入一个单独的线程中,这样您就可以使用该线程的外部超时来检查它是否被阻塞,但是像这样的诚实尝试是肮脏和极端危险的,没有办法得到它也可以 100% 安全地工作。

当您谈论 exe 时,可能会假设这可以仅在 windows 平台上解决?

//create a somewhat unique semaphore key, eg by hashing the application path
QString Key = QString("Local\\MyApp_%1").arg(qHash(QByteArray(argv[0])), 8, 16, QChar('0'));
HANDLE hMutex = CreateMutexW(NULL, FALSE, Key.utf16());
//NOTE: unlikely, but hMutex might be NULL, check for errors

//try to lock the mutex, but don't wait for it
if(WAIT_TIMEOUT == WaitForSingleObject(hMutex, 0))
{ //mutex is locked by another instance
 //TODO: handle that somehow
 return 0;
}

//TODO: place standard QT startup code here, for example
QApplication a(argc, argv);
QtMyApplication w;
w.show();
int iReturn = a.exec();

//release and close the mutex
ReleaseMutex(hMutex);
CloseHandle(hMutex);
return iReturn;

对于更便携的解决方案,可以使用锁定文件完成非常相似的操作(打开一个临时文件以进行独占访问,我认为这就是 QtSingleApplication 所做的),但我个人不喜欢这种基于文件的解决方法。

【讨论】:

  • 您可以使用 QSharedMemory 代替 windows-mutex,如果这样的共享内存部分已经存在,create 将返回 false。
猜你喜欢
  • 2011-05-04
  • 2010-10-30
  • 2021-10-03
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多