每次我在Qt Creator中运行我的项目时,它都会旋转我的应用程序的另一个实例。我必须手动退出应用程序,否则我的Dock会快速完成。太痛苦了。有没有解决的办法?如果我再次运行应用程序时,我可以终止已经运行的版本,这将更有意义。可以这样做吗?
答案 0 :(得分:1)
您可以使用shared memory来解决问题。我已经使用这种方法在已经有一个正在运行的实例时不启动我的程序的另一个实例。实际上我已经实现了这个来实现所谓的单实例应用程序。
但是你的情况与我的情况略有不同,你需要以某种方式从第二个应用程序向第一个应用程序发送信号以使其关闭。我认为您仍然可以使用QSharedMemory
来实现此行为。
我在实现单实例应用程序时所做的是创建一个共享内存,其中包含一个通用唯一ID(UUID)作为键,并且每次我的程序启动时都锁定它,所以如果它已经是锁定我的程序了解已经有一个正在运行的实例并自动关闭。
您需要改进此实施以适应您的要求。理论上你需要做的是将一个函数指针(或一个qt信号)放到共享内存中,当另一个实例出现时,让你的(第二个)实例触发强制退出第一个实例的函数。不幸的是我不知道如何实现这个,但我希望这会给你一个意见......
流程应该如下:
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...";
}
}
祝你好运,别忘了在这里分享你的解决方案;)
编辑:
如果放入一个函数指针或Qt信号然后触发它是不可能的(我希望不是)你可以把一个变量放到共享内存中让我们假设保持运行实例的数量并在你的应用程序中定期(在一个线程中)检查如果它大于1,则关闭应用程序。
在这里注意比赛条件!您可以通过放置每个实例生成的一对随机数和开始时间来避免竞争条件。所以在关闭之前,你的应用确保它是老年人。例如:QPair<int, QDateTime>