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

Command Line closing despite using QProcess::startDetached()

本文关键字:QProcess startDetached 命令行      更新时间:2023-10-16

我试图在我的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. 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);
}