自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony Stage Worker 多線程

系統(tǒng) OpenHarmony
在實際開發(fā)項目經(jīng)常遇到網(wǎng)絡請求、文件讀寫、大圖片加載等相對耗時的操作,如果這些耗時操作都在主線程中處理,就會導致應用UI界面被卡住,無法操作。

??想了解更多關于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

OpenHarmony存在一個與主線程并行的獨立線程–Worker。對于處理耗時操作且不阻塞主線程起到了重要的作用,并且多個線程并發(fā)可以提高CPU和內(nèi)存的利用率。在實際開發(fā)項目經(jīng)常遇到網(wǎng)絡請求、文件讀寫、大圖片加載等相對耗時的操作,如果這些耗時操作都在主線程中處理,就會導致應用UI界面被卡住,無法操作。但需要注意的是:Worker線程中不能直接操作UI,需要通過消息通知UI線程進行更新。

社區(qū)介紹:??Worker??

開發(fā)環(huán)境

系統(tǒng):OpenHarmony 3.2 beta4
開發(fā)板:DAYU200
SDK:API9 - FullSDK(3.2.9.2)

效果

??視頻地址??

OpenHarmony stage worker 多線程-開源基礎軟件社區(qū)

開發(fā)與調(diào)試

社區(qū)提供了Worker Demo,使用API8,F(xiàn)A模型,JS的方式實現(xiàn),如果有興趣可以參看:??JsWorker??。

在API9的版本后,只能選用Stage模型開發(fā),下面我們就介紹下基于API9、Stage模型開發(fā)Worker異步線程。

需求

首先我們先確認我們本次開發(fā)調(diào)試的內(nèi)容
1、UI界面顯示一行文本,用于顯示操作流程,三個按鈕:主線程保存數(shù)據(jù)、子線程保存數(shù)據(jù)、UI。

  • 主線程保存數(shù)據(jù):UI線程向指定文件中寫入1000000條數(shù)據(jù)。
  • 子線程保存數(shù)據(jù):通知Worker線程向指定文件中寫入1000000條數(shù)據(jù)。
  • UI:界面toast提示“click UI”,用于測試在不同線程中保存數(shù)據(jù)是否阻塞主線程操作。

2、在主線程中向指定文件寫入數(shù)據(jù),寫入完成后Toast提示:“數(shù)據(jù)保存成功”。

3、在子線程中向指定文件寫入數(shù)據(jù),寫入完成后Toast提示:“數(shù)據(jù)保存成功”。

4、在執(zhí)行2、3時,點擊UI按鈕,查看操作結(jié)果。

涉及到的API

@ohos.??worker??@ohos.file.fs 暫時沒有,但是可以參看: @ohos.fileio
@ohos.promptAction

項目結(jié)構(gòu)

在介紹相關代碼之前,我們先看下API9 stage模型下的項目目錄結(jié)構(gòu):

OpenHarmony stage worker 多線程-開源基礎軟件社區(qū)

關鍵代碼

創(chuàng)建Worker子線程,需要構(gòu)造ThreadWorker實例,通過ThreadWorker實例屬性onmessage監(jiān)聽Worker發(fā)送給宿主線程的消息。

1、??ThreadWorker??

參數(shù):

參數(shù)名

類型

必填

說明

scriptURL

string


Worker執(zhí)行腳本的路徑。<br/>在FA和Stage模型下,DevEco Studio新建Worker工程路徑分別存在以下兩種情況:<br/>(a) worker腳本所在目錄與pages目錄同級。<br/>(b) worker腳本所在目錄與pages目錄不同級。

options

??WorkerOptions??


Worker構(gòu)造的選項。

返回值:

類型

說明

ThreadWorker

執(zhí)行ThreadWorker構(gòu)造函數(shù)生成的ThreadWorker對象,失敗則返回undefined。

代碼:index.ets

import worker from '@ohos.worker';
private workerInstance: worker.ThreadWorkerprivate readonly scriptURL: string = 'entry/ets/worker/worker.ts'
aboutToAppear() {
// 主線程中創(chuàng)建Worker對象
this.workerInstance = new worker.ThreadWorker(this.scriptURL, {
name: 'worker_thread'
})
// 注冊監(jiān)聽器
// 具體宿主線程發(fā)送的信息
this.workerInstance.onmessage = function(e){
let data = e.data
console.info(`${TAG} workerInstance.onmessage ${data}`)
this.result = data
this.showSaveToast()
}.bind(this)
this.workerInstance.onexit = function () {
console.info(`${TAG} workerInstance onexit`)
}
}
showSaveToast() {
// 數(shù)據(jù)保存成功
promptAction.showToast({
message: '數(shù)據(jù)保存成功',
duration: 2000
})
}

(1)這里需要理解下Stage模型中worker.ThreadWorker接口參數(shù)scriptURL=“entry/ets/worker/worker.ts”:

entry: 為module.json5文件中module的name屬性對應的值;
ets: 表明當前使用的語言。

OpenHarmony stage worker 多線程-開源基礎軟件社區(qū)

(2)主線程與Worker線程間支持的數(shù)據(jù)類型參考??序列化支持類型??。

2、worker/worker.ts

worker.ts腳本通過@ohos.worker.workerPort獲取到ThreadWorkerGlobalScope對象,主要用于Worker線程與宿主線程通信,可以通過postMessage接口發(fā)送消息給宿主線程。

  • onMessage:表示W(wǎng)orker線程收到來自其宿主線程通過postMessage接口發(fā)送的消息時被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行;
  • onMessageerror:表示當Worker對象接收到一條無法被反序列化的消息時被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

worker.ts代碼

import worker from '@ohos.worker';
import { MyMessage } from '../modele/MyMessage'
import { MessageType } from '../modele/MessageType'
import fileIo from '@ohos.file.fs'
const TAG: string = '[worker]'
// 創(chuàng)建worker線程中與主線程通信的對象
const workerPort = worker.workerPort
let fd: number = 0
// worker線程接收主線程信息
workerPort.onmessage = function (e) {
// data:主線程發(fā)送的消息
let data = e.data as MyMessage
console.info(`${TAG} workerPort.onmessage ${e}`)
let type = data.type
switch (type) {
case MessageType.CLOSE: {
// 關閉線程
console.info(`${TAG} workerPort.onmessage close`)
workerPort.close()
break
}
case MessageType.SAVE: {
console.info(`${TAG} workerPort.onmessage save path: ${data.path}}`)
if (data.path) {
// 保存數(shù)據(jù)到文件
if (fd <= 0) {
fd = fileIo.openSync(data.path, 0o2 | 0o100).fd
}
for (var index = 0; index < 1000000; index++) {
fileIo.writeSync(fd, 'Worker Thread ' + data.data + '' + index + ' \n')
}
}
// 向主線程發(fā)送消息
workerPort.postMessage(data.data + ' 數(shù)據(jù)保存完成')
break
}
default: {
console.error(`${TAG} workerPort.onmessage message type error`)
}
}
}
// worker線程發(fā)生error的回調(diào)
workerPort.onerror = function (e) {
console.info(`${TAG} workerPort.onerror ${JSON.stringify(e)}`)
}
3、更新UI界面

通過worker.workerPort.postMessage()向宿主線程發(fā)送消息,宿主線程的worker.ThreadWorker().onMessage()收到消息后,toast提示:“數(shù)據(jù)保存成功”更新UI。此處代碼在上述1、ThreadWorker 和 2、worker/worker.ts 中都有體現(xiàn)。

4、添加配置

在工程的模塊級build-profile.json文件的buildOption屬性中添加配置信息。

"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/worker/worker.ts"
]
}
}

OpenHarmony stage worker 多線程-開源基礎軟件社區(qū)

5、界面布局
build() {
Column() {
Text(this.result)
.fontSize(18)
.fontWeight(FontWeight.Bold)
Button('主線程保存數(shù)據(jù)')
.width('50%')
.height(50)
.fontSize(24)
.margin({
top: 20,
bottom: 20
})
.onClick(() => {
this.showStartSaveToast()
this.result = 'worker test..'
let fd = fileIo.openSync(globalThis.getContext(this).filesDir + '/' + 'catch_log.txt', 0o2 | 0o100).fd
for (var index = 0; index < 1000000; index++) {
fileIo.writeSync(fd, 'UI Thread This write data' + index + ' \n')
}
this.result = 'worker test success'
this.showSaveToast()
})
Button('子線程保存數(shù)據(jù)')
.width('50%')
.height(50)
.fontSize(24)
.margin({
top: 20,
bottom: 20
})
.onClick(() => {
this.showStartSaveToast()
this.result = 'worker test..'
let oldData = 'This write data'
let sendData: MyMessage = new MyMessage()
sendData.type = MessageType.SAVE
sendData.path = globalThis.getContext(this).filesDir + '/' + 'catch_log.txt'
sendData.data = oldData
this.sendMessage(sendData)
})
Button('UI')
.width('50%')
.height(50)
.fontSize(24)
.margin({
top: 20,
bottom: 20
})
.onClick(() => {
promptAction.showToast({
message: 'click UI',
duration: 3000
})
})
}
.width('100%')
.height('100%')
}

到此完成的Worker子線程處理耗時操作任務。

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2023-08-01 16:35:48

鴻蒙ArkUI應用開發(fā)

2009-03-12 10:52:43

Java線程多線程

2024-08-05 00:04:00

JSWeb應用

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2021-12-26 18:22:30

Java線程多線程

2010-01-21 11:27:30

linux多線程機制線程同步

2009-06-29 17:49:47

Java多線程

2023-06-13 13:39:00

多線程異步編程

2011-06-02 17:27:49

iphone 多線程

2020-12-28 08:03:26

多線程進程瀏覽器

2011-07-21 11:12:58

iPhone 線程 多線程

2021-06-11 11:28:22

多線程fork單線程

2023-06-07 13:49:00

多線程編程C#

2010-03-15 17:56:23

Java多線程

2021-03-05 07:38:52

C++線程編程開發(fā)技術(shù)

2022-04-14 11:44:25

LiteOS線程鴻蒙

2009-08-17 16:56:51

C#多線程控制進度條

2015-02-03 15:06:23

android多線程下載
點贊
收藏

51CTO技術(shù)棧公眾號