macos - Qt 创作者 : Quit previous instance of app before running again?

标签 macos qt qt-creator

每次我在 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/

相关文章:

c# - 如何在 Mac OS X 上的 VSCode 项目中包含 'System.Runtime.Serialization.Json' 命名空间?

c++ - 如何按值返回 `QObject` 派生类?

c++ - QListWidget 发送没有项目的 doubleClicked 信号

debugging - 如何在QtCreator中更改“本地人和监视者”面板的位置?

c++ - 没有 SLOT 宏的 Qt 连接

unit-testing - Qt Creator 中的单元测试设置

macos - curl 命令的权限被拒绝

objective-c - 将焦点移至 NSTableView 中新添加的记录

python - 在 Mac OS 上安装后找不到 ansible.cfg

Python 控制台打印输出与 spyder 控制台不同