2

それが問題です。私は自分のプログラムの複数のインスタンスが好きではないので、それらを無効にしました。私のプログラムは特定の MIME タイプを開きます。私のシステム (Ubuntu 12.04) では、これらのファイルの 1 つをダブルクリックすると、次のように実行されます。

/usr/bin/myprogram /path/to/double/clicked/file.myextension

私が言ったように、私は複数のインスタンスが好きではないので、プログラムがすでに実行されていて、ユーザーがこれらのファイルの 1 つを開くことを選択した場合、DBus メッセージが既にインスタンスに送信され、開いているファイルを処理します。したがって、すでに実行中のインスタンスがあり、ユーザーが私のプログラムで開く 3 つのファイルを選択して [Enter] ボタンを押すと、システムは次のように実行します。

/usr/bin/myprogram /path/to/double/clicked/file1.myextension
/usr/bin/myprogram /path/to/double/clicked/file2.myextension
/usr/bin/myprogram /path/to/double/clicked/file3.myextension

これらのインスタンスはすべて、すでに実行中のインスタンスを検出し、開いているファイルをそのインスタンスに送信します。今のところ、まったく問題ありません。

しかし、まだ実行中のインスタンスがなく、ユーザーが自分のプログラムで 3 つのファイルをまとめて開くことを選択した場合はどうなるでしょうか。システムは同時に次のように呼び出します。

/usr/bin/myprogram /path/to/double/clicked/file1.myextension
/usr/bin/myprogram /path/to/double/clicked/file2.myextension
/usr/bin/myprogram /path/to/double/clicked/file3.myextension

これらの各インスタンスは、既に実行中のインスタンスがあることを認識すると、DBus メッセージを既に実行中のインスタンスに送信しようとし、終了します。したがって、3 つのプロセスはすべて同じことを行い、何も実行されません。

この問題を回避するにはどうすればよいですか?

PS: 既に実行中のインスタンスがあるかどうかを検出するために、次のコードを実装します。

bool already_runs(){
return !system("pidof myprogram | grep \" \" > /dev/null");
}
4

2 に答える 2

0

DBusでこれを行う標準的な方法は、バス上でアプリケーションの名前を取得することです。1つのインスタンスがレースに勝ち、実行中のインスタンスになることができます。

ただし、Qt機能を使用してこれを実行できるはずです。これにより、アプリケーションの他の部分との統合が向上します。Qt:シングルインスタンスアプリ保護のベストプラクティスを参照してください。

于 2012-07-24T15:05:40.113 に答える
0

最初のプロセスのpidを保存するために共有メモリを使用します。ここでQSharedMemoryクラスが役立ちます。

プログラムが最初にすべきことは、共有メモリ セグメントを作成し (独自に作成したキーを使用して)、その中に pid を格納することです。create 呼び出しが失敗した場合は、代わりにセグメントへのアタッチを試みることができます。それが成功した場合、そこから元のプロセスの pid を読み取ることができます。

EDIT:また、共有メモリへの書き込みまたは共有メモリからの読み取りの前にlock()を使用し、完了したらunlock()を呼び出すことを忘れないでください。

于 2012-07-24T14:40:13.247 に答える