我正在使用QProcess::start
与我的自定义帮助项目文件一起启动Qt Assistant
。直到我将项目(无帮助项目文件)加载到程序中,它才能正常工作。程序使用自定义库从特定数据生成图像。即使所有进程结束并且我看到生成的图像,也没有其他任何事情发生,当我尝试启动Qt Assistant时,我的程序在尝试启动进程时挂在QProcess:start
函数上。代码是:
show()
函数(公开):
if (!run())
return false;
QByteArray ba("setSource ");
ba.append("qthelp://insyn_help/doc/");
proc->write(ba + page.toLocal8Bit() + '\n');
return true;
run()
函数(私有):
if (!proc)
proc = new QProcess();
if (proc->state() == QProcess::Running)
return true;
QString app = QString(QT_BIN_DIR) + QDir::separator() + QString("assistant");
QString path = QString(PREFIX) + QString(HELP_INSTALL_PATH) + QString("/help_project.qhc");
QStringList args;
args << QLatin1String("-collectionFile")
<< QLatin1String(path.toLatin1())
<< QLatin1String("-enableRemoteControl");
QFileInfo help_project(path);
if (help_project.exists()) {
proc->start(app,args);
if (!proc->waitForStarted()) {
m_exitCode = 1;
emit closed();
return false;
}
}
此代码是AssistantLauncher
类的一部分,该类已使用qmlRegisterType
注册,并作为应用程序窗口的成员添加到main.qml
中。我的程序不会在任何地方触摸它(调用方法show()
除外)。它是单独的对象(除非它是appWindow
的一部分)。问题是,为什么仅在我的程序完成某些工作后才能启动该过程?以及为什么QProcess::start
甚至没有超时。
UPD:我将proc->start(app,args);
移到了子进程,该进程是通过使用fork()获得的,而现在我的程序挂在pid_t child = fork().
上,因此问题在于无法创建新进程。
答案 0 :(得分:0)
答案是不要使用fork()
,因为在大型项目中这很危险。有关更多信息,请访问http://www.evanjones.ca/fork-is-dangerous.html。 posix_spawn
也挂起了我的项目。现在,我决定在开始时fork()
进行新流程,并通过管道向其发送命令。