たとえば、TextEditor アプリケーションがあります。メモ帳++のように。ファイルの内容が表示されていたタブがあります。
OS のデフォルトのテキスト エディタは TextEditor Application に設定されています。新しいファイル アプリケーションを開くと、タブが追加され、コンテンツがそこに配置されます。
Qtで新しいファイルを開くときにアプリケーションが新しいインスタンスを実行しないようにする方法は?
あなたが考える最良の方法はどれですか?
1 に答える
問題は、単一インスタンスのアプリケーションをどのように作成できるかです。ファイルを開くと、オペレーティング システムは関連するアプリケーションを開き、コマンド ライン引数としてファイルを指定します。OSメカニズムを介して実行中のアプリケーションに「ファイルを開く」コマンドを単純に委任することはできません。自分で実装する必要があります。
AppWhirr プロジェクトでは、インスタンス間の通信に QLocalServer/Client を使用しました。AppWhirr アプリが実行されると、修正 ID を持つ QLocalServer が既に使用されているかどうかがチェックされます。そうでない場合、アプリケーションのこのインスタンスが最初/唯一の実行中のインスタンスです。ID が既に取得されている場合は、アプリケーションの別のインスタンスが既に実行されていることを意味するため、この 2 番目のインスタンスは 2 つのことのみを行います: Qt のローカル クライアント/サーバー通信を介して、指定された入力引数を他のインスタンスに送信し、通信が正常に終了した場合終了します (2 番目のインスタンス)。
これは問題に対する 1 つの解決策であり、かなりのコーディングが必要であり、ローカルのクライアント/サーバー通信を他の目的で使用したくない場合はお勧めしませんが、実行可能な解決策です。
もう 1 つの解決策は、アプリケーションの最初のインスタンスが固定の場所にテキスト ファイルを作成し、インスタンスの ID を書き込むことです。この後、2 番目のインスタンスはテキスト ファイルを読み取り、指定された ID にメッセージを送信できます。そしてもちろん、最初のインスタンスは終了時にテキスト ファイルを削除する必要があり、おそらく最初のインスタンスがクラッシュした場合にテキスト ファイルを削除するためのフェールセーフ コードを実装する必要があります。このソリューションは、最初のソリューションよりも使用するリソースが少なくなりますが、フェイルセーフ クリーンアップ コードが必要です。
または、3 番目のオプションとして、@Matteo Italia が提案したようなサードパーティのソリューションを使用できます。