2010-11-03 13 views
10

Voglio che la mia applicazione apra solo un processo, cioè se il processo è già aperto e l'utente vuole aprire di nuovo l'exe - non aprirà un altro processo.Come forzare la mia applicazione ad aprire un solo exe? qt, linux

come posso farlo in Qt - linux?

10x!

+3

Dovresti davvero accettare le risposte alle tue domande a meno che tu non voglia che le persone rispondano più. – ereOn

risposta

0

L'applicazione può verificare se è presente un determinato file nella home directory dell'utente. Se è presente, l'applicazione si chiude. Se non è lì, l'applicazione lo crea e continua. Naturalmente, si potrebbe ottenere una condizione di gara se l'utente avvia l'applicazione più volte contemporaneamente. Ma per la maggior parte dei casi questa semplice soluzione dovrebbe essere sufficiente.

+0

Non so chi ha revocato questo e perché. Ma questo è pericoloso e non portabile. 'Qt' ha il supporto nativo per questa funzione, quindi è consigliabile utilizzarlo. – ereOn

+0

Sono d'accordo su "non portatile" e QtSingleApplication è l'opzione migliore. Ma perché pericoloso? A causa delle condizioni della gara? Un flag O_CREATE aperto in open() dovrebbe occuparsi di questo .. – bew

+0

Pericoloso perché chiunque crea questo file manualmente può impedire l'esecuzione del programma. – ereOn

23

Quello che stai cercando è QtSingleApplication.

Se si avvia un'altra istanza dell'applicazione, la prima verrà persino notificata (è possibile passare qualsiasi struttura dati desiderata).

L'ho usato per portare l'applicazione esistente in primo piano ogni volta che viene avviata un'altra istanza.

+0

Downvoted perché QtSingleApplication funziona solo nel processo dell'utente corrente.Non funzionerà se altri utenti avviano lo stesso processo in altre sessioni utente. –

+5

@JimInTexas: nessuna offesa, ma l'OP voleva solo un modo per impedire allo stesso utente di avviare diversi processi della propria applicazione. A tal fine, 'QtSingleApplication' è ** esattamente ** ciò di cui aveva bisogno. Ora forse non si adatta al ** tuo particolare caso d'uso, ma è irrilevante per la domanda. Di solito, le risposte vengono downvoted perché sono sbagliate, e per quanto riguarda questa domanda, non è il caso. È ? – ereOn

15

Utilizzare il codice seguente in main.cpp per impedire l'esecuzione di più di un'istanza dell'applicazione. Ho testato questo codice sotto Linux (in QtCreator) e funziona (funziona anche per Windows). Trovo questa soluzione semplice e facile da implementare. L'esempio è per un'applicazione console. Il codice rimane lo stesso per un'applicazione GUI, controlla i commenti nel codice.

//main.cpp 
#include <QCoreApplication> //Console application 
//#include <QApplication>  //GUI application 
#include <QSharedMemory> 
#include <QDebug> 
//Your QMainWindow derivated class goes here : 
//#include "MainWindow.h" 

int main(int argc, char *argv[]) 
{ 

    QCoreApplication app(argc, argv); 

    app.processEvents(); 

    //---- Check for another instance code snippet ---- 

    //GUID : Generated once for your application 
    // you could get one GUID here: http://www.guidgenerator.com/online-guid-generator.aspx 
    QSharedMemory shared("62d60669-bb94-4a94-88bb-b964890a7e04"); 

    if(!shared.create(512, QSharedMemory::ReadWrite)) 
    { 
    // For a GUI application, replace this by : 
    // QMessageBox msgBox; 
    //msgBox.setText(QObject::tr("Can't start more than one instance of the application.")); 
    //msgBox.setIcon(QMessageBox::Critical); 
    //msgBox.exec(); 

    qWarning() << "Can't start more than one instance of the application."; 

    exit(0); 
    } 
    else { 
     qDebug() << "Application started successfully."; 
    } 
    //---- END OF Check for another instance code snippet ---- 

    // Only one instance is running, declare MainWindow 
    //MainWindow myMainWindow; 
    //myMainWindow.show(); 


    //We enter the Qt Event loop here, we don't leave until the MainWindow is closed 
    //or the console application is terminated. 
    return app.exec(); 
} 
+0

Come posso aprire la finestra principale dell'applicazione se l'applicazione è già stata avviata? – devdev

+1

Se si avvia l'applicazione ed è l'unica istanza, l'esecuzione raggiungerà il ciclo di eventi Qt (app.exec) e la finestra principale verrà visualizzata normalmente. Se non è l'unica istanza in esecuzione, la nuova istanza raggiungerà l'exit() prima di mostrare la finestra principale. La tua finestra esistente rimarrà aperta. Ho aggiunto alcuni altri commenti nel mio esempio sopra. –

+3

Troppo fragile, penso che se l'applicazione si arresta, lascia il segmento sharedmem dietro e non è possibile riavviare il processo. "Ma se l'ultimo thread o processo si blocca senza eseguire il distruttore QSharedMemory, il segmento di memoria condivisa sopravvive all'incidente." (Documenti QSharedMemory) –

3

Questo potrebbe non interessarti, ma ho pensato che sarebbe stato utile portarlo su. Sto usando lo stesso QtSingleApplication e ho sperimentato qualche strano comportamento qualche giorno fa. QtSingleApplication non sembra funzionare in tutte le circostanze. Ho fatto questa esperienza in Windows, ma a seconda che si tratti di un bug specifico per Windows o inteso dal design di QtSingleApplication, potrebbe essere applicato anche a Linux.

A seconda del modo in cui si avvia l'applicazione, sono possibili più istanze. Ho fatto questa esperienza quando ho fatto un test della mia applicazione usando il mio programma di installazione. Il programma di installazione avvia automaticamente l'applicazione al termine. Quando ho quindi avviato la mia applicazione utilizzando il collegamento desktop, ho avuto due istanze in esecuzione. Quindi la funzionalità di QtSingleApplication sembra dipendere dal modo in cui viene avviata l'applicazione (e da quale utente?). La documentazione non è chiara su questo. Ma penso che di solito ci si aspetterebbe che funzioni in tutte le circostanze, se non diversamente specificato.

Quindi, se non è necessaria la funzionalità aggiuntiva aggiunta da QtSingleApplication, QSystemSemaphore o QSharedMemory sembra essere il modo migliore per andare.

Problemi correlati