❝这是QML的ListModel在另一个线程异步更新数据的示例。 ❞
线程ListModel包含ListView控件和一个ListModel的。该ListModel的对象被另一个线程异步更新,并将结果传递回主线程。定时器定时从工作线程中请求更新:
Timer {
id: timer
interval: 2000; repeat: true
running: true
triggeredOnStart: true
onTriggered: {
var msg = {'action': 'appendCurrentTime', 'model': listModel};
worker.sendMessage(msg);
}
}
在工作线程中,一旦数据加载完成,ListModel就被同步:
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
}
}
WorkerScript包含一个使用WorkerScript将昂贵的计算卸载到另一个线程中的示例。「这可以防止UI被阻塞」。本示例以帕斯卡三角形的方式计算数字,而不是以最佳方式进行,因此通常需要几秒钟才能完成计算。通过在另一个线程中的WorkerScript中执行此操作,在此期间不会阻塞UI。
当UI需要另一个值时,会将请求发送到WorkerScript:
Spinner {
id: rowSpinner
label: "Row"
onValueChanged: {
resultText.text = "Loading...";
myWorker.sendMessage( { row: rowSpinner.value, column: columnSpinner.value } );
}
}
然后,workerscript
可以自由地花费很长时间来计算它:
WorkerScript.onMessage = function(message) {
//Calculate result (may take a while, using a naive algorithm)
var calculatedResult = triangle(message.row, message.column);
//Send result back to main thread
WorkerScript.sendMessage( { row: message.row,
column: message.column,
result: calculatedResult} );
}
完成后,结果将通过WorkerScript类型返回到主线程事件:
WorkerScript {
id: myWorker
source: "workerscript.mjs"
onMessage: {
if (messageObject.row == rowSpinner.value && messageObject.column == columnSpinner.value){ //Not an old result
if (messageObject.result == -1)
resultText.text = "Column must be <= Row";
else
resultText.text = messageObject.result;
}
}
}
C:\Qt\{你的Qt版本}\Examples\{你的Qt版本}\quick\threading
https://doc.qt.io/qt-5/qtquick-threading-example.html