2009-07-04 6 views
4

Je développe une application dans le cacao, qui doit vérifier si cette application est déjà en cours au démarrage. Si elle est déjà en cours d'exécution, je dois quitter la nouvelle instance. ..Cherche d'une solution parfaiteVérifiez si l'application est déjà en cours d'exécution

+1

Même question que http://stackoverflow.com/questions/1081218/ideal-way-to-single-instance-apps-on-the-mac? – smorgan

+0

Cette question identique a la meilleure réponse: [link] (http://stackoverflow.com/questions/684911/how-to-detect-whether-an-os-x-application-is-already-lancement) –

Répondre

5

Il semble que vous vouliez empêcher plusieurs instances de votre application de fonctionner en même temps. Normalement, les applications Cocoa n'autorisent pas l'exécution simultanée de plusieurs instances, vous n'avez donc pas besoin d'effectuer cette vérification. Existe-t-il une circonstance spécifique dans laquelle vous constatez qu'une application de cacao est utilisée simultanément?

En général, une façon cacao de résoudre ce problème est de lancer des applications dans NSWorkspace. Cela retourne un NSArray contenant un dictionnaire pour chaque application lancée. Vous pouvez parcourir le tableau pour voir si l'application que vous recherchez est déjà en cours d'exécution. Je vous conseille d'utiliser la valeur avec la clé NSApplicationBundleIdentifier qui aura une valeur comme "com.mycompany.myapp" plutôt que de chercher le nom. Si vous avez besoin de trouver l'identifiant du bundle pour une application, vous pouvez consulter son fichier info.plist dans le package de l'application.

0

Ma réponse ici n'est pas spécifique à la mise en œuvre de l'objet-c mais plutôt à une approche générale. Un système semblable à * nix, un démon créera normalement un fichier pid quelque part pour indiquer son existence. Si un démon n'autorise pas plusieurs instances, alors un autre feu de l'application devrait d'abord vérifier si un tel fichier pid existe, si c'est le cas, exister lui-même.

+1

À noter que cette réponse ne s'applique qu'aux démons, pas aux applications réelles. De plus, il ne s'applique pas à un démon spécifique à Mac OS X; la méthode recommandée est de vérifier avec launchd à la place. http://developer.apple.com/technotes/tn2005/tn2083.html –

+0

Bien que j'aie utilisé le mot «démon», le modèle de fichier pid ne doit pas être restreint pour un démon à instance unique. Dans les applications interactives de l'utilisateur, normalement, il est implémenté via .lockfile sous le profil des applications. Il sert presque le même but que le fichier pid du démon. Merci pour le lien. Launchd est recommandé et il semble que tout dépend de la façon de spécifier la configuration. Mais je suis toujours verrouillé pour voir où il est garanti d'empêcher le multi-instance de se lancer. – jimx

0

Vous pouvez popen() une instance de la commande ps et rechercher le nom de l'application. Si vous le trouvez, fermez le nouveau. peut-être pas le moyen le plus rapide, mais cela fonctionne :-)

Questions connexes