每次我在 Qt Creator 中运行我的项目时,它都会启动我的应用程序的另一个实例。我必须手动退出应用程序,否则我的 Dock 会很快装满。多么痛苦。有没有解决的办法?如果当我再次运行应用程序时,我可以终止已经运行的版本,这会更有意义。这能做到吗?
最佳答案
您可以使用 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>
关于macos - Qt 创作者 : Quit previous instance of app before running again?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347402/