如何通过QsystemSemphore强制我的应用程序成为单个进程? Qt,Linux

时间:2010-11-04 10:19:01

标签: linux qt process

  

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

您好,

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

10倍!

1 个答案:

答案 0 :(得分:0)

我认为使用QSystemSemaphore很容易解决这个问题。据我所知,这个类只支持阻塞锁定尝试。接缝是那里的主要观点:你只能调用释放(总是成功,但不会告诉你任何事情)或获取(只告诉你通过永远阻止你达到极限):

如果实例创建了一个信号量,它将不知道它是否真的创建了它,或者它是否使用现有信号量。如果它是获取的二进制信号量,可能会发生两件事。它获取锁定,意味着它是第一个也是唯一一个实例,或者它只是阻塞,直到第一个实例退出。

要绕过这个问题,您可以将该测试放入一个单独的线程中,这样您就可以检查它是否在该线程上使用外部超时被阻止,但是这样的诚实尝试是脏的并且风险极大,没有办法获得它也是100%安全地工作。

当你谈到一个exe时,可能会认为这可以解决windows platform-only?

//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的功能)可以完成非常相似的操作,但我个人不喜欢基于文件的解决方法。