Я не думаю, что это легко разрешимо с помощью QSystemSemaphore. Насколько я вижу, этот класс поддерживает только блокировку попыток блокировки. Этот шов является основным моментом: вы можете только выслать (всегда удается, но ничего не говорит) или приобретать (что только говорит вам, что вы достигли предела, заблокировав вас навсегда):
Если экземпляр создает семафор, он не будет знать, действительно ли он его создал или если он использует существующий. Если это двоичный семафор при приобретении двух вещей, может случиться. Либо он получает блокировку, то есть ее первый и единственный экземпляр, либо он просто блокируется там до тех пор, пока не завершится первый экземпляр.
Чтобы обойти эту проблему, вы можете поместить этот тест в отдельный поток, чтобы вы могли проверить, заблокирован ли он с использованием внешнего тайм-аута в этом потоке, но попытки честности подобны грязным и крайне рискованным, нет никакого способа заставьте его работать на 100% безопасно таким образом.
Как вы говорите об exe, можно предположить, что это может быть решено только для окон платформы?
//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), но лично мне не нравится, что на основе файлов обходной путь.
Зачем вам нужно использовать 'QSystemSemaphore'? Почему бы не использовать 'QSingleApplication'? –
Я не хочу использовать этот класс. – devdev
-1 Привет друг, Почему бы вам не принять или изменить свой существующий вопрос (очень похожий на этот), прежде чем начинать новый, почти идентичный? http://stackoverflow.com/questions/4087235/how-to-force-my-application-to-open-one-exe-only-qt-linux –