Forum Clubic

[QT4] Interdire 2e lancement d'une appli

Bonjour
J’ai un petit programme en QT4.2.2 + windows XP qui fonctionne un peu à la manière d’un notifieur : une icone dans le systray qui change d’aspect en fonction des réponses d’une tâche périodique, et ouverture d’une fenêtre uniquement lorsque l’intervention urgente de l’opérateur est nécessaire.
Bien que le programme soit prévu pour tourner en permanence, l’opérateur peut le fermer temporairement, puis le rouvrir par un raccourci bureau.

Mon problème est de savoir comment s’assurer qu’un clic sur ce raccourci bureau ne lancera pas une dexième fois l’appli si la première instance est toujours active.
J’ai regardé du côté Mutex, mais je ne vois pas comment ca peut marcher dans ce cas.
Et si possible je voudrais éviter la solution du flag dans un fichier temporaire …

Merci d’avance pour vos réponses


    HANDLE hMutex;

    hMutex = CreateMutex (NULL,FALSE,"_CUnlockMe_Class_");
    if ( (GetLastError() == ERROR_ALREADY_EXISTS) || (hMutex == 0) )
    {	
  ReleaseMutex(hMutex);
  CloseHandle(hMutex);
  
  return 0;
    }

En WINAPI, c’est comme ça que je fait. (dans le WinMain)

Je sais pas comment tu peux te démerder, mais tu peux faire comme nombre d’applications : créer un fichier avec le pid du processus (au format texte, ou binaire via fwrite() ou équivalent), et vérifier son existence pour éviter de lancer le programme si jamais le pid existe déjà en mémoire.

J’ai dejà utilisé cette méthode en C++, mais là, en QT, je ne retrouve pas la notion de mutex nommé.
je fais

static QMutex mutex;
mutex.lock();

Ce qui fait que mon lock est bien efficace pour l’ensemble de mon instance, mais pas d’une instance à l’autre.

J’ai trouvé ça[/url] :neutre: (qui vient d’[url=http://www.trolltech.com/products/qt/addon/solutions/catalog/3/Utilities/qtsingleapplication/]ici)

J’avais vu la page de Trolltech lors d’une recherche google, mais l’exemple m’avait échappé.
En plus, j’avoue que j’avais un peu oublié, vu que ca ne fait pas partie de la doc fournie avec QT4.

Je vais regarder ca de plus près.

Ton lien pointe vers la version pour QT3, mais la QT4 est juste à côté ;

Le pb, c’est que cette classe n’est disponible qu’en téléchargement, et uniquement pour ceux qui possèdent la version commerciale.

Ca existe aussi pour QT 4[/url], ils en parlent même [url=http://www.qtcentre.org/forum/f-qt-programming-2/t-qtsingleapplication-937.html]ici. (je vais dodoter)

J’avais bien vu la version QT4 ; c’est ce que je voulais dire en disant qu’elle existait “à côté”

Ce matin, j’ai donc téléchargé le .zip et j’ai installé le package.
D’après mes premières constatations, l’exemple donné fonctionne même mieux que je ne l’espérais, puisque non seulement il n’ouvre pas une deuxième instance, mais qu’en plus il nous replace dans l’existant
Il me reste à comprendre exactement comment ca marche, pour pouvoir l’intégrer à mon programme