Sous Windows, il est courant de créer un mutex nommé et d'utiliser la présence de cela pour déterminer qu'une instance d'une application donnée est déjà en cours d'exécution. Cela a ses inconvénients, mais fonctionne principalement. P>
Je peux penser à une manière de le faire sur le Mac: p>
Y a-t-il quelque chose intégré au cacao / carbone plus facile que les options ci-dessus? Sinon, lequel des trois sont les plus utilisés sur le Mac? Je suppose que 2 ou 3 ... p>
6 Réponses :
Macs n'ont pas d'instances de la même manière que Windows. De manière générale, vous souhaitez que l'application fonctionnant deux fois, vous devez physiquement copier le binaire, puis double-cliquez sur la version copiée. P>
Si vous avez besoin de deux instances d'une application en cours d'exécution, vous ne pensez pas comme un utilisateur Mac :). P>
Edit: Ceci est techniquement em> pas vrai. Vérifiez les commentaires. P>
En d'autres termes, il n'est pas nécessaire que nous parlions des applications d'interface graphique. Cela fonctionne déjà de cette façon.
Ce n'est pas vrai. Si vous démarrez l'application à partir du terminal, par exemple, vous pouvez lancer simultanément les instances n i>. Le fait qu'il soit rare i> ne veut pas dire que l'affaire ne doit pas être prise en compte.
À droite. Je vous donnerai même un exemple simple, ce que je crois, c'est une jolie commune: Démarrer une application de Postinstall d'un installateur. Si vous recherchez l'application et lancez à partir de Spotlight, la deuxième instance s'allume.
La gestion des processus de mappage entre les systèmes d'exploitation disparates ne fonctionne pas. Ou ne fonctionne pas bien. Par défaut et sans effort particulier, vous obtenez une copie et une seule copie de l'application. P>
Voici une question similaire antérieure qui va une étape plus loin que cette question actuelle, et avec certaines réponses qui discutent de la mise en route lorsqu'il existe plusieurs copies d'une image ou plusieurs applications nécessitant une coordination. P>
Comment détecter si un système d'exploitation X L'application est déjà lancée p>
Pour une introduction au contexte du temps d'exécution et en particulier autour des daemons et des agents Mac OS X (et pour les cas où vous devez avoir plusieurs copies d'une exécution exécutable, comme une piscine ou une piscine à Apache), Voir: P>
Si vous écrivez une application de cacao, vous pouvez utiliser Nsworkspace pour voir si un autre processus fonctionne avec votre identifiant de paquet. J'ai vu quelques applications qui présentent une boîte de dialogue et disent: "Une instance de cette application est déjà en cours d'exécution" - je pense que Firefox le fait en fait. p>
Ce n'est pas une approche très "Mac-ish", mais cela fera le travail. p>
C'est un peu ce que je veux faire, mais mon application de test n'est pas une application de cacao (voir commentaire mis à jour dans mon Q ci-dessus). J'ai trouvé GetNextProcess () en carbone qui pourrait aider. Toutes les autres suggestions?
élaborer plus loin à l'aide de Nsworkspace. Essayez d'utiliser LancementApplications dans Nsworkspace. Cela renvoie un nsarray contenant un dictionnaire pour chaque application lancée. Vous pouvez faire boucle via le tableau pour voir si l'application que vous recherchez est déjà en cours d'exécution. Je vous conseillerais d'utiliser la valeur avec la clé NSApplicationBundentifulifier qui aura une valeur comme "com.mycompany.myapp" plutôt que de rechercher le nom. Si vous avez besoin de trouver l'identificateur de paquet pour une application, vous pouvez consulter son fichier info.plist dans le package d'applications. P>
C'est un peu ce que je veux faire, mais mon application de test n'est pas une application de cacao (voir commentaire mis à jour dans mon Q ci-dessus). J'ai trouvé GetNextProcess () en carbone qui pourrait aider. Toutes les autres suggestions?
Ce serait la façon de le faire si vous êtes une application carbone. Êtes-vous déjà associé à la bibliothèque de carbone? Cependant, la même fonctionnalité d'instance unique s'applique également aux applications du carbone. On dirait que vous construisez peut-être un programme de ligne de commande UNIX, est-ce correct? Il pourrait être utile de décrire ce que vous construisez plus en détail.
Notez que Nsworkspace -LaunchedaPlications code> a été amorti dans Mac OS X 10.7. Apple vous recommande d'utiliser maintenant
NsworkSpace -RunningApplications code> à la place (10.6+): développeur.apple.com/library/mac/#documentation/cocoa/referen CE / ... < / a>
Si vous deviez déployer votre application avec Java Web Start (JWS), vous pouvez utiliser javax.jnlp.singleinstangeservices . Le provisioning JWS fournirait également des mises à jour automatiques du programme. p>
Le code suivant peut être utilisé les applications Quitter avec le même identifiant de paquet qui fonctionnent déjà.
Il affiche également une alerte après cela. p>
appdelegate.applicationDiderfinishlaunching code > P>
let runningApp =
NSWorkspace.shared.runningApplications
.filter { item in item.bundleIdentifier == Bundle.main.bundleIdentifier }
.first { item in item.processIdentifier != getpid() }
if let running = runningApp {
running.forceTerminate()
let alert = NSAlert()
alert.messageText = "App was alreday running"
alert.informativeText = "App was terminated."
alert.alertStyle = NSAlert.Style.informational
alert.addButton(withTitle: "OK")
alert.runModal()
}
Il suffit de regarder comment les applications sont lancées et interagies avec je ne pensais pas qu'il était possible d'avoir plusieurs instances ... du moins pas avec des applications groupées dans un bel .app.
Ok j'ai trompé un peu dans ma question ... Je voulais vraiment exécuter une application de test qui a fait une bouquet de validation, mais le lancant pendant que l'application est en cours d'exécution causée par de faux positifs. Afin de ne pas perdre de temps à réduire les problèmes inutiles, je voulais que l'application de test cauve avec une erreur si l'application est en cours d'exécution. Sous Windows, je l'ai résolu à l'aide de l'approche mono-instantanée et supposé que je veux faire la même chose pour le Mac.
[NsRunningApplication de NsRunningPlication SI si l'application avec le même kundleID est en cours d'exécution, activez-la et fermez ce qui commence.] [1] [1]: Stackoverflow.com/questions/684911/...