【问题标题】:C++ and Qt: How can I start an application that will live on after the caller app has finished?C++ 和 Qt:如何启动在调用者应用程序完成后将继续存在的应用程序?
【发布时间】:2021-07-12 12:37:59
【问题描述】:

这就是我想做的。

我有一个脚本,目前刚刚开始打印一条消息。等待 5 秒并打印另一条消息,然后要求用户按任意键结束。

我有一个 Qt 应用程序需要调用这个脚本然后退出。

我希望控制台窗口打开以显示,脚本文本和这个新进程能够在 Qt 应用程序完成后继续。

在 Windows 中,我的脚本称为“update.bat”

所以我试过了:

QProcess::startDetached("update.bat"); 
QCoreApplication::quit();

但是控制台(Windows 1)没有打开(所有输出都在 QtCreator 中),并且在应用程序完成后它肯定不会继续。

有没有办法使用 Qt 做到这一点?

如果可能的话,我不想依赖 Windows 中的 CreateProcess,并使用 Qt 解决方案。

编辑:

我还尝试了 setCreateProcessArgumentModifier 并使用 cmd /k 启动 update.bat 脚本。所有这一切的结果都是一样的。输出被重定向到 QtCreator 控制台,当在 Qt 之外执行应用程序时没有任何反应(这一切都是在您按下按钮时发生的)。

    QProcess p;
//    QProcess process;
//    process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)
//    {
//        args->flags |= CREATE_NEW_CONSOLE;
//        args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
//        args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
//        args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
//                                           | FOREGROUND_INTENSITY;
//    });
    p.startDetached("cmd.exe",QStringList() << "/k" << "update.bat");

【问题讨论】:

  • 尝试在 Qt-Creator 之外运行您的应用程序。我在 Windows 上的 Qt 应用程序开发中没有使用 Qt-Creator,我得到了控制台窗口。
  • 我试过了。当我按下按钮触发上述代码时,什么也没有发生。这应该有效吗?
  • 也许你需要cmd /k update.bat
  • 也试过了。还是什么都没有。
  • 我忘记了我通常在 GUI 应用程序中使用 QProcess 来提取生成的控制台应用程序的输出并将其显示在 QTextBox 或类似文件中。相关:https://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput

标签: c++ qt


【解决方案1】:

所以这不是我想出来的。这更像是我想出一个旁路。

基本上以系统工程启动脚本。但我设法使它工作的方式是这样的:

  1. 从单独的线程调用系统函数。否则,应用程序将锁定所有内容(包括从外部杀死它),直到系统中运行的所有内容完成。您可以为此使用 QThread。

  2. 使用 taskkill 作为脚本的第一步杀死应用程序: taskkill/im App.exe

这对于一些事情来说并不理想,主要是我在几个地方看到调用系统不是很安全。但是由于脚本本身是由应用程序生成的,所以在我的情况下,它对于我的目的来说已经足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多