Проект зависает на QProcess::start при запуске QtAssistant

Я использую 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(). Так что проблема в том, что новый процесс не может быть создан.

1 ответ

Решение

Ответ не использовать fork() потому что это опасно в больших проектах. Больше на http://www.evanjones.ca/fork-is-dangerous.html. posix_spawn также висит мой проект. Теперь я решил fork() Новый процесс в начале и отправлять ему команды через канал.

Другие вопросы по тегам