1

プロセスがあり、それが実行されているかどうかを確認し、その方向で決定を下します。つまり、このアプリケーションの実行中のインスタンスを別のインスタンスから確認したいと思います。

2種類のデータを処理するアプリケーションの2つのインスタンスを実行できます。3番目のインスタンスが開くと、そのタイプの別のインスタンス(すでに作成されている2つのタイプから)がすでに実行されているかどうかを確認する必要があります。その場合、新しいインスタンスを閉じて、そのタイプのすでに実行中のインスタンスにメッセージを送信する必要があります。

このため、うまくいかないと思いますQtSingleApplication

システム全体のミューテックスを作成し、その方法でチェックを実行したいのですが、Qtでシステム全体のミューテックスを確認していません。

アプリケーションのスレッド専用のQMutexがあります。

オンラインで検索するときにも呼ばれるものがありますがQSystemMutex、それはカスタムソリューションだと思いますか?Qtインストールまたはアシスタントで見つかりませんでした。

では、Qtを使用してシステム全体のミューテックスを作成する方法はありますか?

4

2 に答える 2

0

あなたは間違いなくそれを行うことができますQtSingleApplication。アプリケーションがすでに実行されている場合は、終了する必要はありません。提供するものの上にブートストラッププロトコルを定義できますQtSingleApplication。つまり、そのapiをロッキングプリミティブとして使用します。

あなたができることは、特定のタイプのメッセージを実行中のインスタンスに送信することです。たとえば、タイプの文字列表現です。簡単です。実行中のインスタンスにメッセージを送信すると、彼はあなたが歓迎されているかどうかを教えてくれます。

  • アプリケーションが起動するたびに、メッセージをリッスンします(実行中のメッセージがある場合でも)。タイプが異なる場合、彼は1つのメッセージのみを確認できます。
  • 実行中のアプリケーションがない場合、彼は直接仕事に取り掛かります。
  • 実行中のアプリケーションがある場合、彼はhelloメッセージ(たとえば、彼のタイプ)を送信し、ACK、NACK、またはタイムアウトを待ちます。タイムアウトした場合の対処方法を決定します。
  • 返信を待っていて、こんにちはを受け取った場合は、拒否します。

ps:あなたが説明するのは正確にはミューテックスではありません。次のコード

int main(int argc, char **argv) {
   QtSingleApplication app(argc, argv);

   if (app.isRunning())
       return 0;
   //blah blah blah
}

すでにミューテックスです。

于 2013-02-18T09:46:04.150 に答える
0

ミューテックスは、1 つのプロセスでオブジェクトとして使用されるように定義されています。プロセス外の解決策を探しています。

簡単な解決策は、ファイルシステムを使用することです。ファイルを作成し、プロセスが停止したら削除します。ただし、複数のプロセスが異なるディレクトリから実行されている場合や、アプリケーションがクラッシュした場合は、これが難しくなる可能性があります。

より高度なソリューションは、共有メモリ オブジェクトを使用することです。これらのオブジェクトはプロセスの外部に存在し、どのプロセスからでもチェックおよび変更できます。QT の共有メモリの例は、http:
//doc.qt.digia.com/4.7-snapshot/ipc-sharedmemory.htmlにあります。

于 2013-02-18T09:27:07.187 に答える