尽管使用了QProcess :: startDetached(),命令行仍然关闭

时间:2014-03-24 17:33:34

标签: c++ qt qt4 qprocess

我试图通过我的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中手动运行批处理文件时,它正在按需运行。 有没有人知道如何保持流程运行以便我可以使用服务器?

1 个答案:

答案 0 :(得分:1)

  1. startDetached是一个静态函数。您不需要流程实例。

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

  3. 由于waitForStarted()方法对您的startDetached实例一无所知,因此receiver来电是免费的。你只是写了一个欺骗你的混淆C ++。使用Qt时无法等待分离进程启动。一个独立的过程是不容错过的。

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

  5. 因此,您的方法应修复如下:

    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);
    }