0

我正在使用我的自定义帮助项目文件QProcess::start启动。Qt Assistant在我将项目(不是帮助项目文件)加载到我的程序之前,它工作正常。Programm 使用自定义库从特定数据生成图像。即使所有进程都结束并且我看到生成的图像并且没有其他任何事情发生,当我尝试启动 Qt 助手时,我的程序在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().所以问题是无法创建新进程。

4

1 回答 1

0

答案是不要使用fork(),因为它在大型项目中很危险。更多信息请访问http://www.evanjones.ca/fork-is-dangerous.htmlposix_spawn也挂了我的项目。现在我决定fork()一开始就新建进程并通过管道向它发送命令。

于 2018-10-03T11:16:01.043 回答