2011-12-01 9 views
5

Qt Creatorでプロジェクトを実行するたびに、アプリの別のインスタンスがスピンアップします。私は手動でアプリケーションを終了する必要があり、そうでなければ私のドックはかなり高速になります。何が痛い。これを回避する方法はありますか?私がもう一度アプリケーションを実行すると、すでに実行中のバージョンを終了することができたらもっと意味があるでしょう。これはできますか?Qt Creator:もう一度実行する前にアプリの前のインスタンスを終了しますか?

+0

[ビルドまたは実行前に実行中のアプリケーションを強制終了できるQt Creatorを構成できますか?](http://stackoverflow.com/questions/14964093/can-you-configure-qt-creator-to実行前の実行アプリケーション - または - ) – bpierre

答えて

1

shared memoryを使用すると、問題を解決できます。私はすでに実行中のインスタンスがある間、私のプログラムの別のインスタンスを起動しないために、このアプローチを使用しています。実際には、これを実装していわゆるシングルインスタンスアプリケーションを実現しています。

あなたのケースは私とは少し異なりますが、何とか2番目のアプリケーションから最初のアプリケーションに信号を送信して閉じる必要があります。私はあなたがまだQSharedMemoryを使用してこの動作を達成できると思います。

単一インスタンスのアプリケーションを実現するために何をしたかは、普遍的な一意のID(UUID)をキーとして共有メモリを作成し、私のプログラムがロックをかけ始めるたびにプログラムがロックされているすでに実行中のインスタンスが存在し、自動的に終了することを理解しています。

要件を満たすには、この実装を改善する必要があります。理論的には、関数ポインタ(またはqtシグナル)を共有メモリに置き、別のインスタンスが起動すると、(2番目の)インスタンスが起動して最初のインスタンスを終了させるようにします。

IN MAIN 
    check if shared memory in use 
     if yes 
     fire the exit function via shared memory to close 1st app 
     if no 
     put the function pointer which will close the app when another instance come up 

    do stuff 

をあなたにわずかなヒントを与えるために、私のコード:残念ながら流れを、私はこれを実装する方法を知りませんが、私は、これはあなたの意見を与えるだろう願っています...

次の多少のようにする必要があります

QSharedMemory shared(AppConstants::UUID); //Global variable 

int main(){ 
// Ensure single instanse of App 
if(!shared.create(512, QSharedMemory::ReadWrite)) 
{ 
    // QMessageBox msgBox; 
    QMessageBox::critical(0, QObject::tr("App is already running!"), QObject::tr("App is already running!"), QMessageBox::Ok, QMessageBox::Ok); 
    qCritical() << "Cevirgec is already running!"; 

    exit(0); 
} 
else { 
    qDebug() << "App staring..."; 
} 
} 

幸運をたどり、ここにあなたのソリューションを共有することを忘れないでくださいように単一のインスタンス用です。)

EDIT:

関数ポインタやQtシグナルを入れてから起動できない場合(私は願っていません)、共有メモリに変数を置くと、実行中のインスタンスの数やアプリケーション内で定期的に(スレッド)チェックし、1より大きい場合はアプリケーションを閉じます。

ここに競合状態に気をつけろ!各インスタンスによって生成された乱数のペアと開始時刻を入れて競合状態を回避することができます。閉じる前に、あなたのアプリはそれが高齢者であることを保証します。例:QPair<int, QDateTime>

+1

イエス・キリスト。 Qt Creatorの設定を忘れてしまったのではないかと思いました。これは狂気です。あなたのソリューションをありがとう、本当にそれを行うための最善の方法のように見えます。しかし、これはQt Creatorにはあまり反映されていません。 – jbrennan

+0

よく、QTCreatorがそれを処理することを期待するには低レベルです:( – destan

+1

うーん、私はQt Creatorがそれを処理すると考えました。 – jbrennan

関連する問題