Запуск метода QML в дополнительном потоке - PullRequest
0 голосов
/ 03 августа 2020

Я хочу написать элемент QML, который может динамически запускать функции + параметры в отдельных потоках.

Думаю, это будет выглядеть так:

import QtQuick 2.0

Item {

    function runThread(fnc, params)
    {
        // run this fnc function with the given params in seperate thread without blocking ui
    }

}

Выполняемые функции должен иметь доступ к любым состояниям из моего основного движка. Включая подключенные cpp объекты, свойства элемента, ...

1 Ответ

0 голосов
/ 03 августа 2020

QtConcurrent может помочь. Попробуйте что-то вроде этого:

void TestObj::testFct(int someParam, const QJSValue &callback){
    auto *watcher = new QFutureWatcher<int>(this);
    QObject::connect(watcher, &QFutureWatcher<int>::finished, this, [this, watcher, callback]() {
        int returnValue = watcher->result();
        QJSValue cbCopy(callback);
        QJSEngine *engine = qjsEngine(this);
        cbCopy.call(QJSValueList { engine->toScriptValue(returnValue) });
        watcher->deleteLater();
    }); 
    watcher->setFuture(QtConcurrent::run(this, &TestObj::testFctAsync, someParam));
}

Затем вызовите его из QML следующим образом:

function testCall() {
    testObj.testFct(param, function(returnVal) {
        console.log("Asynchronous function returned: " + returnVal);
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...