在这个例子中,我们将介绍如何在QML应用中使用QML语言提供的threading功能,实现多任务。更多的阅读在:doc.qt.io/qt-5/qtquic…
\
我们使用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。
\
运行我们的例程:
\
\
\
\
整个项目的源码在: github.com/liu-xiao-gu…
\