gpt4 book ai didi

c++ - 有没有办法从 QML WorkerScript 运行 C++?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:53 27 4
gpt4 key购买 nike

我有一个缓慢的 I/O 操作,我需要从 QML UI 进行控制。 I/O 接口(interface)在 C++ 中。基本上,当用户按下按钮时,我需要发送消息并从设备获得响应。我希望用户在等待响应时能够做其他事情。 WorkerScript 似乎是实现这一目标的最简单方法,但是由于正常的 QDeclarativeContext 不会传递到线程中,我该如何将我的 C++ 接口(interface)放入脚本中呢?有没有办法将 C++ 导入 QML 的 javascript?我什至不需要在主线程中维护 C++ 上下文,它完全存在于 worker 中并且只是来回传递消息我会很好。
编辑:
澄清:@dtech 的回答满足了我当前的需要,但我仍然想知道问题的答案:是否有可能将 C++(即使不是有状态的)放入 WorkerScript。

最佳答案

当您可以选择将 QObject 放入专用线程、在不阻塞主线程的情况下执行代码并以异步方式将结果来回传递给 QML 时,您为什么要这样做?

您不需要 WorkerScript,这也不是它的预期用途。由于您的代码无论如何都是 C++,因此您只需要 QThreadQObject

这是一个简单的例子:

class Worker : public QObject {
Q_OBJECT
public slots:
void doWork() {
int i = 0;
while (i < 100) {
result(i++);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
signals:
void result(int r);
};

class Controller : public QObject {
Q_OBJECT
public:
Controller() {
w = new Worker;
t = new QThread;
w->moveToThread(t);
connect(this, SIGNAL(start()), w, SLOT(doWork()));
connect(w, SIGNAL(result(int)), this, SIGNAL(result(int)));
t->start();
}
private:
Worker * w;
QThread * t;
signals:
void start();
void result(int r);
};

// in main.cpp
Controller cw;
engine.rootContext()->setContextProperty("Work", &cw);
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); // load main qml


// QML

Column {
Button {
id: start
onClicked: Work.start()
}
Text {
id: res
}
}

Connections {
target: Work
onResult: res.text = r
}

这是一个简单的阻塞 worker,它将阻塞其线程大约 50 秒,但仍然能够发出将在 QML 端更新的结果,同时保持 GUI 线程空闲。请注意,一旦调用工作函数,就无法以任何方式中断、暂停或控制它,如果需要,您将必须实现 non-blocking worker。反而。也不需要 C++ Controller 作为 QML 和“线程对象”之间的中介,因为 QML 似乎不能直接与此类对象相处。

关于c++ - 有没有办法从 QML WorkerScript 运行 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com