Проект зависает на QProcess :: start при запуске QtAssistant - PullRequest
0 голосов
/ 25 сентября 2018

Я использую 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 Ответ

0 голосов
/ 03 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...