2010-11-04 1 views
-4

Можно создать дубликат:
How to force my application to open one exe only? qt, linuxКак заставить мое приложение быть единым процессом с помощью QsystemSemphore? Qt, Linux

Привет,

Я хочу, чтобы заставить мое приложение, чтобы открыть один ехе только, как сделать это с помощью QSystemSemaphore? т. Е. Если процедура

10x!

+0

Зачем вам нужно использовать 'QSystemSemaphore'? Почему бы не использовать 'QSingleApplication'? –

+0

Я не хочу использовать этот класс. – devdev

+1

-1 Привет друг, Почему бы вам не принять или изменить свой существующий вопрос (очень похожий на этот), прежде чем начинать новый, почти идентичный? http://stackoverflow.com/questions/4087235/how-to-force-my-application-to-open-one-exe-only-qt-linux –

ответ

0

Я не думаю, что это легко разрешимо с помощью 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), но лично мне не нравится, что на основе файлов обходной путь.

+0

Вы можете использовать QSharedMemory вместо windows-mutex, create вернет false, если такой раздел разделяемой памяти уже существует. – TheSUNSTAR

Смежные вопросы