2016-05-09 12 views
4

QSharedMemory私のアプリケーションの2つのプロセスが同時に実行されないようにしています。プロセスAは、起動時にQSharedMemoryを「ロック」に設定します。今度は私のプロセスBが "前景に戻って来てください"のような値を設定します。QSharedMemoryの変更点を確認してください

プロセスAがQSharedMemoryの変更を観察する簡単な方法はありますか?つまり、愚かなプルーイングタイマーを実装しないでください。

答えて

2

ここでは、次のとおりです。QSystemSemaphore

その軽量化対応QSemaphoreと同様に、QSystemSemaphoreは、複数のスレッドからアクセスすることができます。 QSemaSoreとは異なり、QSystemSemaphoreは複数のプロセスからアクセスすることもできます。

QSharedMemoryのように、QSystemSemaphoreはキーベースのアクセス方法を使用します。

1

共有メモリを使用する代わりに、プロセスは名前付きローカルサーバーに対してQLocalSocketを開き、失敗した場合はQLocalServerを開きます。後続のすべてのプロセスは、サーバーへのソケットをオープンするのに成功し、それと通信することができます。それはおそらく仕事を達成するためのもっとも簡単で最も携帯に便利な方法です。あなたの質問をanswereするにはQt 5

1

に移植されている場合に限っ

また、QtSingleApplicationを使用することができます:いいえ、QSharedMemoryは、このような機能を持っていません。

「シングルインスタンス」アプリケーションを使用したい場合は、https://github.com/Skycoder42/QSingleInstanceを使用できます。

これは、一度に1つのアプリケーションだけをインスタンス化し、自動的にアクティブなウィンドウを前面に持ってきて、新しいプロセスから実行中のプロセスにパラメータを渡すことができます。

簡単な例:

#include "mainwindow.h" 
#include <QApplication> 
#include <QMessageBox> 
#include <qsingleinstance.h> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QSingleInstance instance; 

    MainWindow *w = NULL; 

    instance.setStartupFunction([&]() -> int { 
     w = new MainWindow(NULL); 
     instance.setNotifyWindow(w); 
     w->show(); 
     return 0; 
    }); 

    QObject::connect(qApp, &QApplication::aboutToQuit, [&](){ 
     delete w; 
    }); 

    QObject::connect(&instance, &QSingleInstance::instanceMessage, [&](QStringList args){ 
     QMessageBox::information(w, "Message", args.join('\n')); 
    }); 

    return instance.singleExec(); 
} 

これは、あなたが期待するwoudl同じように、メインウィンドウが表示されます。アプリケーションがもう一度実行されると、現在実行中のメインウィンドウがフォアグラウンドに持ち上げられ、引数を含むメッセージボックスが表示されます。

注:この例ではQWidgetsを使用していますが、QSingleInstanceはguiアプリケーションまたはコアアプリケーションでも使用できます。

関連する問題