Possible Duplicate:
How to force my application to open one exe only? qt, linux
嗨,
我想强制我的应用程序只打开一个exe文件,如何通过QsystemSemaphore来做到这一点? 即如果过程
10 倍!
最佳答案
我认为使用 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 所做的),但我个人不喜欢那种基于文件的解决方法。
关于linux - 如何通过 QsystemSemphore 强制我的应用程序成为单一进程? Qt、Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095643/