Проект зависает на 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()
Новый процесс в начале и отправлять ему команды через канал.