
Разработка приложений на C++_Практическая работа №8
.pdf
Page {
objectName: "mainPage" allowedOrientations: Orientation.All
WorkerScript {
id: worker
source: "fibonacci_worker.js"
onMessage: {
txt.text = "Result: " + messageObject.reply; console.log("Calculation complete:" + messageObject.reply);
}
}
TextInput {
id: numberInput anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right text: "3"
}
Button {
id: btn
anchors.top: numberInput.bottom anchors.left: parent.left anchors.right: parent.right
text: "Calculate Fibonacci number"
5

onClicked: {
var n = parseInt(numberInput.text); if (!isNaN(n)) {
worker.sendMessage({ type: "calculate", n: n });
}
}
}
Text {
id: txt
anchors.top: btn.bottom anchors.left: btn.left anchors.right: btn.right text: "Result: " enabled: true
}
}
// fibonacci_worker.js function fibonacci(n) {
if (n < 2) { return n;
} else {
var a = fibonacci(n - 1); var b = fibonacci(n - 2); return a + b;
}
}
6

WorkerScript.onMessage = function(message) { if (message.type === "calculate") {
var n = message.n;
var result = fibonacci(n);
WorkerScript.sendMessage({ 'reply': result }) console.log(result)
}
}
В данном примере мы используем WorkerScript для параллельного вычисления n-го элемента из последовательности Фибоначчи.
Процесс вычисления элемента последовательности Фибоначчи может быть ресурсоемким в зависимости от его номера. Поэтому вычисление элементов в отдельном потоке может улучшить производительность приложения.
Задача разбивается на две части: основной поток и рабочий поток. В
основном потоке выполняется пользовательский интерфейс, а в рабочем потоке выполняются вычисления. Мы используем WorkerScript для управления рабочим потоком.
WorkerScript - это класс, который позволяет запускать JavaScript-код в отдельном потоке. Он используется для выполнения длительных операций,
которые могут блокировать основной поток. Взаимодействие между рабочим потоком и основным потоком осуществляется посредством передачи сообщений между ними.
В рабочем потоке мы определяем функцию `fibonacci(n)`, которая рекурсивно вычисляет n-й элемент последовательности Фибоначчи. Когда
7

вычисление завершено, мы отправляем сообщение с результатом выполнения
восновной поток с помощью метода `WorkerScript.sendMessage()`.
Восновном потоке мы создаем экземпляр `WorkerScript` и
устанавливаем исходный код файла JavaScript, который будет выполняться в рабочем потоке. Мы также добавляем слушатели для сообщений, которые будут отправляться из рабочего потока. Когда сообщение принимается, мы меняем значение свойства `result` в основном потоке.
ВQML мы создаем элементы пользовательского интерфейса: поле для ввода номера элемента последовательности Фибоначчи, кнопку для запуска вычисления и текстовое поле для отображения результата. При нажатии на кнопку мы отправляем сообщение с номером элемента последовательности в рабочий поток.
Вобщем и целом, использование WorkerScript позволяет выполнять сложные вычисления в отдельном потоке, не блокируя основной поток и не приводя к зависанию интерфейса пользователя.
8