Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过QSystemShore强制我的应用程序成为单进程?Qt,Linux_Linux_Qt_Process - Fatal编程技术网

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

如何通过QSystemShore强制我的应用程序成为单进程?Qt,Linux,linux,qt,process,Linux,Qt,Process,可能重复: 嗨 我想强制我的应用程序只打开一个exe,如何通过QSystemeMapore实现? i、 e.如果程序 10倍 我认为用QSystemeSaphore很难解决这个问题。就我所见,这个类只支持阻塞锁尝试。这可能是最主要的一点:您只能调用release(总是成功,但不会告诉您任何事情)或acquire(它只会告诉您,通过永远阻止您,您达到了极限): 如果一个实例创建了一个信号量,它将不知道它是否真的创建了它,或者它是否使用了一个现有的信号量。如果它是acquire上的二进制信号量,则

可能重复:

我想强制我的应用程序只打开一个exe,如何通过QSystemeMapore实现? i、 e.如果程序


10倍

我认为用QSystemeSaphore很难解决这个问题。就我所见,这个类只支持阻塞锁尝试。这可能是最主要的一点:您只能调用release(总是成功,但不会告诉您任何事情)或acquire(它只会告诉您,通过永远阻止您,您达到了极限):

如果一个实例创建了一个信号量,它将不知道它是否真的创建了它,或者它是否使用了一个现有的信号量。如果它是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所做的),但我个人不喜欢这种基于文件的解决方法。

为什么需要使用
QSystemeMapore
?为什么不使用
QSingleApplication
?我不想使用这个类。-1嗨,朋友,在开始一个几乎相同的新问题之前,你为什么不接受或编辑你现有的问题(非常类似于这个问题)???很抱歉,我希望所有用户都能看到我的问题,但问题的类型不同:-(我用qsystemsmapore而不是QSharedMemory更新了我对您原始问题的回答,这几乎是一样的。让我知道它是否有效。您可以使用QSharedMemory而不是windows互斥锁,如果这样的共享内存节已经存在,create将返回false。