【问题标题】:Command Line closing despite using QProcess::startDetached()尽管使用 QProcess::startDetached() 命令行关闭
【发布时间】:2014-03-24 17:33:33
【问题描述】:

我正在尝试通过我的 Qt 应用程序中的 cmd.exe 中的批处理文件打开服务器。尽管我使用 QProcess::startDetached() 来启动命令行,但它在启动后立即关闭。服务器正在启动,但不是“服务”进程被杀死。这是我的代码:

void DICOMReceiver::startReceiver()
{
    QProcess receiver;
    boost::filesystem::path dbDir = boost::filesystem::absolute(databaseDirectory.toStdString());
    receiver.startDetached("cmd.exe", QStringList() << "/c" <<
                           "dcmrcv.bat" << "AETitle:11112" << "-dest " << dbDir.string().c_str());
    receiver.waitForStarted();
}

当我在 cmd.exe 中手动运行批处理文件时,它可以正常工作。 有人知道如何保持进程运行以便我可以使用服务器吗?

【问题讨论】:

    标签: c++ qt qt4 qprocess


    【解决方案1】:
    1. startDetached 是一个静态函数。您不需要流程实例。

    2. 您应该将工作目录传递给startDetached。据我所知,它“关闭”了,因为批处理文件在它正在寻找的地方不存在。

    3. 您的 waitForStarted() 调用是无操作的,因为 startDetached 方法对您的 receiver 实例一无所知。您只是编写了欺骗您的混淆 C++。使用 Qt 时,无法等待分离的进程启动。分离的过程是即发即弃的。

    4. 不要使用waitForXxx 方法,因为它们会阻塞它们所在的线程,并使 UI 无响应。改用信号槽连接并编写异步代码。

    所以,你的方法应该固定如下:

    void DICOMReceiver::startReceiver()
    {
      boost::filesystem::path dbDir =
        boost::filesystem::absolute(databaseDirectory.toStdString());
      // FIXME
      const QString batchPath = QStringLiteral("/path/to/the/batch/file");
      QProcess::startDetached("cmd.exe", QStringList() << "/c"
                              << "dcmrcv.bat" << "AETitle:11112" << "-dest "
                              <<< dbDir.string().c_str(), batchPath);
    }
    

    【讨论】:

    • 感谢您的回答,但是启动后它仍然立即关闭。我看到服务器的输出冲过屏幕然后消失了。我也尝试在没有其他参数的情况下启动它,但这也不是问题。当我只启动 cmd.exe 时它可以工作(即使是我的第一个版本)。
    • 那么问题不在于您的代码,而在于批处理文件提前退出。替换一个只显示其参数并在最后执行pause 的虚拟批处理文件。它会起作用的。然后慢慢开始添加来自dcmrcv.bat 的东西。真的是调试101,此时与Qt或C++无关。
    • 对我来说似乎不合逻辑,因为当我在 cmd.exe 中手动调用批处理文件时它没有关闭,并且当我创建指向它的链接时它也没有关闭,给它需要的参数,只需双击运行链接。使用 QProcess 时它刚刚关闭。但我会试一试。
    • 感谢您的回答。一个论点是 -dest 目录。我把它当作两个论点。那是个错误……
    • @El_Mewo 看,一个虚拟的批处理文件会告诉你。这是一种有时非常方便的调试技术:)
    最近更新 更多