これらの質問同じプログラムの 2 つのインスタンスの実行をブロックする方法は? 、C または C++ で単一のインスタンス アプリケーションを作成する方法、およびアプリケーションの複数のインスタンスを防止する方法では、プラットフォームで同じアプリケーションの複数のインスタンスが開かないようにする方法について具体的に説明しています ( Windows
、Linux
)。
これを実現するクロスプラットフォームの方法はありますか?
他の質問でこれに対処している他の人が見つからなかったので、私の質問に答えます。
これは、boost/interprocess/sync/named_mutex
(私が使用したboost 1.63
)を使用してクロスプラットフォームの方法で実現できます。
と の両方Linux
でテストしましたがWindows
、実装により、アプリケーションの 2 番目のインスタンスを開くことができません。
私が見つけた問題は、プロセスを (両方のプラットフォームで) 強制終了すると、デストラクタ~MyApplication
が呼び出されないため、ミューテックスが削除されないことです。したがって、システムを再起動した後でのみ、アプリケーションを再度実行できます。
#include <boost/interprocess/sync/named_mutex.hpp>
#include <iostream>
class MyApplication
{
public:
MyApplication() = default;
~MyApplication()
{
if (mLockedByThisInstance)
{
boost::interprocess::named_mutex::remove("myApplicationMutex");
}
}
bool IsAlreadyRunning()
{
mLockedByThisInstance = mNamedMutex.try_lock();
if (!mLockedByThisInstance)
{
return true;
}
return false;
}
int Run(int argc, char *argv[])
{
// Application main loop
return 0;
}
private:
bool mLockedByThisInstance = false;
boost::interprocess::named_mutex mNamedMutex{ boost::interprocess::open_or_create,
"myApplicationMutex" };
};
int main(int argc, char *argv[])
{
MyApplication myApplication;
if (myApplication.IsAlreadyRunning())
{
std::cout << "MyApplication is already running!\n";
return 1;
}
return myApplication.Run(argc, argv);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加