在QML应用中实现threading多任务
Posted yutingliuyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在QML应用中实现threading多任务相关的知识,希望对你有一定的参考价值。
在这个样例中,我们将介绍怎样在QML应用中使用QML语言提供的threading功能,实现多任务。
很多其它的阅读在:http://doc.qt.io/qt-5/qtquick-threading-example.html
我们使用Ubuntu SDK来创建以个最主要的QML项目:
Main.qml
import QtQuick 2.0 import Ubuntu.Components 1.1 /*! \brief MainView with a Label and Button elements. */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "threading.liu-xiao-guo" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false width: units.gu(60) height: units.gu(85) Page { title: i18n.tr("threading") ListView { anchors.fill: parent model: listModel delegate: Component { Text { text: time } } ListModel { id: listModel } WorkerScript { id: worker source: "dataloader.js" } Timer { id: timer interval: 2000; repeat: true running: true triggeredOnStart: true onTriggered: { var msg = {‘action‘: ‘appendCurrentTime‘, ‘model‘: listModel}; worker.sendMessage(msg); } } } } }
在这里,我们使用了一个ListView来显示从worker thread发送来的信息(通过更新model)。这里:
WorkerScript { id: worker source: "dataloader.js" }
WorkerScript定义了一个worker thread。它的运行代码在dataloader.js中:
dataloader.js
// ![0] WorkerScript.onMessage = function(msg) { if (msg.action == ‘appendCurrentTime‘) { var data = {‘time‘: new Date().toTimeString()}; msg.model.append(data); msg.model.sync(); // updates the changes to the list } } // ![0]
在Main.qml中,我们定义了一个Timer,每2秒发送一个请求给worker thread。
它的參数是一个例如以下定义的object:
{‘action‘: ‘appendCurrentTime‘, ‘model‘: listModel};
在work thread接受到发送来的信息后。在上面的代码中。检查msg中的action。并同一时候更新传入的model。
执行我们的例程:
以上是关于在QML应用中实现threading多任务的主要内容,如果未能解决你的问题,请参考以下文章
Java中实现多线程继承Thread类与实现Runnable接口的区别
如何在 Python 和 Qt Quick QML 应用程序中实现简化的双向数据绑定
如何在 Qt/C++/QML 中实现类似 WPF 的 MVVM?