2009-07-04 10 views
7

Windowsでは、名前付きミューテックスを作成し、それを使用して特定のアプリケーションのインスタンスがすでに実行中であることを確認するのが一般的です。これには欠点がありますが、ほとんどの場合動作します。Macでのシングルインスタンスアプリケーションへの理想的な方法

私はMac上でこれを行うための方法を考えることができます:

  • 列挙実行中のプロセスのpthreadミューテックスの名前

    1. ファイルを作成し、ロック
    と一致するものを探してください

    Cocoa/Carbonには、上記のオプションより簡単なものがありますか?そうでない場合、3つのうちどれがマックで最も使用されていますか?私は2または3と仮定します...

  • +0

    アプリを起動してやりとりする方法を見てみると、複数のインスタンスを持つことはできないとは思っていませんでした。少なくともアプリは素敵なアプリにまとめられていません。 – Cogsy

    +0

    Ok私は少し質問しました。アプリケーションの実行中に起動するテストアプリを実行したかったのですが、誤検出が発生しました。無駄な問題を追跡する時間を無駄にしないために、私は、アプリケーションが実行されている場合、テストアプリケーションがエラーで退くことを望んでいました。ウィンドウズでは、私はそれを単一インスタンス化の手法を使って解決し、私も同じことをMacでやりたいと思っていました。 – psychotik

    +0

    [同じbundleIDを持つアプリケーションが実行されているかどうかを検出NSRunningApplication使用は、それを活性化して起動するものを閉じます。] [1] [1]:http://stackoverflow.com/questions/684911/how-to- os-x-applicationが既に起動しているかどうかを検出する/ 23775478#23775478 –

    答えて

    7

    MacはWindowsと同じようにインスタンスを持っていません。一般的に言えば、バイナリをコピーしてコピーしたバージョンをダブルクリックするだけで、物理的に2回アプリケーションを実行する必要があります。

    アプリケーションを2つ実行する必要がある場合は、Macユーザーのようには思えません:)。

    編集:これはです。技術的にはではありません。コメントを確認してください。

    +5

    つまり、GUIアプリケーションについて話す必要はありません。それはすでにそのように動作します。 – Chuck

    +16

    それは当てはまりません。たとえば、端末からアプリケーションを起動する場合は、_ N_インスタンスを同時に起動できます。それが_uncommon_であるという事実は、その事件が考慮されるべきではないということを意味するものではありません。 – Dev

    +0

    右。私はあなたに簡単な例を与えます。これはかなり一般的なものです:インストーラのインストール後にアプリを起動することです。アプリを検索してSpotlightから起動すると、2番目のインスタンスが点灯します。 –

    1

    異種のオペレーティングシステム間のマッピングプロセス管理は機能しません。またはうまくいきません。デフォルトでは特別な努力を必要とせずに、1つのコピーとアプリケーションのコピーを1つだけ取得します。

    これは、この現在の質問よりもさらに進んだ似たような質問です。イメージのコピーが複数ある場合や、調整が必要な複数のアプリケーションがある場合には、インターロックについて議論する回答があります。ランタイム・コンテキストに、特にMac OS Xのデーモンとエージェントの周りに導入するため

    How to detect whether an OS X application is already launched

    (およびそれらのケースのためにあなたは、プールとして、または、実行可能なランニングの複数のコピーを持っている必要がありますそして、)Apacheのに似て、次を参照してください。

    http://developer.apple.com/technotes/tn2005/tn2083.html

    1

    を使用すると、Cocoaアプリケーションを書いている場合は、別のプロセスがあなたのバンドル識別子で実行されているかどうかを確認するためにNSWorkspaceを使用することができます。私はいくつかのアプリを見て、ダイアログを表示し、「このアプリのインスタンスはすでに実行されています」 - 実際はFirefoxがそれをしていると思います。

    これはあまり「マジック」アプローチではありませんが、それは仕事を完了させます。

    +0

    これは私がやりたいことですが、テストアプリはCocoaアプリではありません。 CarbonでGetNextProcess()が見つかりました。他の提案がありますか? – psychotik

    8

    NSWorkspaceをさらに詳しく説明します。 NSWorkspaceでlaunchApplicationsを使用してみてください。これは、起動された各アプリケーションの辞書を含むNSArrayを返します。配列をループして、探しているアプリが既に実行中かどうかを確認できます。名前を検索するのではなく、 "com.mycompany.myapp"のような値を持つキーNSApplicationBundleIdentifierで値を使用することをお勧めします。アプリのバンドル識別子を見つける必要がある場合、アプリパッケージ内のinfo.plistファイルを見ることができます。

    +0

    これは私がやりたいことですが、私のテストアプリはCocoaアプリではありません(私のQで更新されたコメントを見てください)。 CarbonでGetNextProcess()が見つかりました。他の提案がありますか? – psychotik

    +0

    あなたがカーボンアプリの場合、それはそれを行う方法になります。あなたは既にカーボンライブラリにリンクしていますか?ただし、Carbonアプリケーションにも同じ単一インスタンス機能が適用されます。あなたがUNIXのコマンドラインプログラムをビルドしているように聞こえますが、それは間違いありませんか?あなたが構築しているものをより詳しく説明すると役に立ちます。 –

    +0

    「NSWorkspace -launchedApplications」はMac OS X 10.7で償却されました。 Appleは代わりに 'NSWorkspace -runningApplications'(10.6+)を使用することを推奨します:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html# // apple_ref/occ/instm/NSWorkspace/runningApplications –

    0

    Java Web Start(JWS)を使用してアプリケーションをデプロイする場合は、javax.jnlp.SingleInstanceServiceを使用できます。 JWSプロビジョニングでは、プログラムの自動更新も行われます。

    関連する問題