QWebEngine: синхронное выполнение runJavascript - QEventLoop блокирует вызовы Javascript
Использование Qt 5.15.2 - синхронное выполнение runJavascript.
Проблема:
Я попробовал как отдельное приложение, и он работал нормально, все работает, как ожидалось. Но в моем проекте на eventLoop->exec() функция JS не выполняется (вызывается runJavascript).
QSharedPointer<QEventLoop> loop = QSharedPointer<QEventLoop>(new QEventLoop());
req.get()->m_pWebEngineView->page()->runJavaScript(req.get()->m_strJSFuncSignature, [loop](const QVariant& val) {
if (loop->isRunning()) {
loop->quit();
}
});
loop->exec(QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents);
Описание:
Мы создаем ОДНОПоточное приложение, которое читает XML-файл и создает пользовательский интерфейс HTML / Js / Css. Я использую гибкий макет CSS для размещения элементов пользовательского интерфейса. В коде я хочу получить вычисленный размер и позицию синхронно в cpp.
Чтобы добиться синхронной связи с Javascript, я использовал технику цикла локальных событий, упомянутую в QtWebEngine - синхронно выполнить JavaScript, чтобы прочитать результат функцииQtWebEngine - синхронно выполнить JavaScript для чтения результата функции . Приложение зависает, функция Js вообще не вызывается.
Наблюдение:
Без QEventLoop все вызовы runjavascript успешно выполняются один за другим в конце, т.е. после того, как все операторы в программе выполнены.
С QEventLoop вызываются все вызовы runjavascript, но соответствующие функции Js не выполняются. Приложение зависает, потому что не вызывается обратный вызов runjavascript.
Почему это происходит? Пожалуйста, помогите.
1 ответ
Нашел проблему. Я запускал локальный QtEventLoop в функции cpp, которая вызывается из JS. Локальная функция QEventLoop в cpp никогда не завершается, потому что функция Js, вызываемая в локальной QEventLoop, ожидает завершения текущего вызова Js. Вид тупика.
Решение: я поставил вызов, поступающий от Js к cpp, в глобальный цикл событий.