我试图通过我的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中手动运行批处理文件时,它正在按需运行。 有没有人知道如何保持流程运行以便我可以使用服务器?
答案 0 :(得分:1)
startDetached
是一个静态函数。您不需要流程实例。
您应该将工作目录传递给startDetached
。总而言之,我知道它“关闭”,因为批处理文件在它正在寻找的地方不存在。
由于waitForStarted()
方法对您的startDetached
实例一无所知,因此receiver
来电是免费的。你只是写了一个欺骗你的混淆C ++。使用Qt时无法等待分离进程启动。一个独立的过程是不容错过的。
不要使用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);
}