woeker及taskpool的简单实现

woeker及taskpool的简单实现

HarmonyOS
2024-05-23 22:03:48
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fujiang1981

通过@ohos.taskpool 和@ohos.worker 接口,实现字符串的简单排序,展示了如何启动worker线程和taskpool线程。

使用的核心API

@ohos.taskpool

@ohos.worker

核心代码解释

worker代码解释:

创建worker线程

import worker, { MessageEvents } from '@ohos.worker'; 
//提示弹窗 
@CustomDialog 
struct CustomDialogExample{ 
 controller:CustomDialogController 
​ 
 build(){ 
   Column(){ 
     Text('worker线程已完成') 
      .fontSize(20) 
      .margin({top:10,bottom:10}) 
     Flex({justifyContent: FlexAlign.SpaceAround}){ 
       Button('我知道了').onClick((event: ClickEvent) => { 
         this.controller.close() 
      }) 
    } 
  } 
} 
} 
​ 
@Entry 
@Component 
export struct Workers { 
 @State message: string = ''; 
 @State message2 : string = '' ; 
 dialogController: CustomDialogController = new CustomDialogController({ 
 builder:CustomDialogExample({ 
}), 
   alignment:DialogAlignment.Default 
}) 
 //指定子线程的路径 
 myworker:worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/worker1.ts') 
 myworker2:worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/worker2.ts') 
​ 
​ 
​ 
 build() { 
   Row() { 
     Column() { 
       TextInput() 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .onChange((value1)=>{ 
           this.message=value1 
        }) 
       Text(this.message2) 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
           //线程1,延迟3秒 
       Button("倒序:延迟3秒") 
        .width('50%') 
        .onClick(()=>{ 
           //将信息传递给子线程1 
           this.myworker.postMessage(this.message) 
           //接收子线程返回的消息 
           this.myworker.onmessage = (e:MessageEvents):void=>{ 
             let dataout:ESObject = e.data 
             this.message2 = dataout 
             this.dialogController.open() 
             //消灭线程1 
             this.myworker.terminate() 
          } 
        }) 
       //线程2,延迟3分钟,验证worker任务执行时长上限可超过3分钟 
       Button("倒序:延迟3分钟") 
        .width('50%') 
        .onClick(()=>{ 
           //将信息传递给子线程2 
           this.myworker2.postMessage(this.message) 
           //接收子线程返回的消息 
           this.myworker2.onmessage = (e:MessageEvents):void=>{ 
             let dataout:ESObject = e.data 
             this.message2 = dataout 
             this.dialogController.open() 
             //消灭线程2 
             this.myworker2.terminate() 
          } 
        }) 
​ 
​ 
       Button("清除") 
        .width('50%') 
        .onClick((event: ClickEvent) => { 
          this.message='' 
           this.message2='' 
      }) 
    } 
    .width('100%') 
  } 
  .height('100%') 
} 
}

创建worker子线程

//worker线程1,延迟3秒 
import worker ,{MessageEvents}from '@ohos.worker'; 
​ 
const workerin =worker.workerPort 
//接收来自主线程的信息 
workerin.onmessage = (e:MessageEvents):void=>{ 
​ 
 let datain = e.data 
 let start = new Date().getTime() 
 while (new Date().getTime() - start<3000){ 
   continue 
} 
//将字符串倒序排列 
 let dataout = datain.split("").reverse().join("") 
 console.info("testworkerin",dataout) 
​ 
//将处理结果返回主线程 
  workerin.postMessage(dataout) 
}

taskpool代码解释

import taskpool from '@ohos.taskpool'; 
@Concurrent 
function concurrentTask(func:Function){ 
 func(); 
} 
​ 
@Concurrent 
function selFun(){ 
​ 
​ 
} 
//任务1 
function createtask(){ 
 let task = new taskpool.Task(concurrentTask,selFun) 
 return task 
} 
//任务2 
function waittask(task:taskpool.Task){ 
​ 
 taskpool.execute(task,taskpool.Priority.HIGH) 
  .then(()=>{ 
     let start = new Date().getTime() 
     while (new Date().getTime() - start < 3000) { 
       continue 
    } 
  }) 
} 
//取消任务 
function canceltask(task:taskpool.Task){ 
 try { 
   taskpool.execute(task, taskpool.Priority.HIGH) 
   taskpool.cancel(task) 
} catch (e) { 
   console.error("[cancelTask] cancel failed" + e.toString()) 
} 
} 
​ 
@Entry 
@Component 
export  struct taskpools { 
 @State message: string = ''; 
 @State message2:string = '' 
 task:taskpool.Task = new taskpool.Task(concurrentTask,selFun) 
 build() { 
   Row() { 
     Column() { 
       TextInput() 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .onChange((value1)=>{ 
           this.message=value1 
        }) 
       Text(this.message2) 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
​ 
       Button("倒序:立即执行") 
        .width('50%') 
        .onClick(() => { 
         this.task = createtask() 
         this.message2=this.message.split("").reverse().join("") 
      }) 
       Button("等待:3秒后执行") 
        .width('50%') 
        .onClick(() => { 
         waittask(this.task) 
         this.message2=this.message.split("").reverse().join("") 
      }) 
       Button("取消:打断执行") 
        .width('50%') 
        .onClick(() => { 
         this.message2="取消成功" 
         canceltask(this.task) 
      }) 
    } 
    .width('100%') 
  } 
  .height('100%') 
} 
}

实现效果

worker实现效果


适配的版本信息

IDE:DevEco Studio 4.0.1.601

SDK:HarmoneyOS 4.0.10.11

分享
微博
QQ
微信
回复
2024-05-24 21:54:33
相关问题
如何简单实现相机关闭
149浏览 • 1回复 待解决
如何使用taskpool实现多线程
477浏览 • 1回复 待解决
如何实现解构Obejct.assign?
313浏览 • 1回复 待解决
ArtUI简单问题求助!
5165浏览 • 1回复 待解决
TaskPool与Worker区别
590浏览 • 1回复 待解决
TaskPool和Worker异同点
653浏览 • 1回复 待解决
应用通用获焦走焦方式如何实现
509浏览 • 1回复 待解决
taskpool管理策略是什么
334浏览 • 1回复 待解决
taskpool使用 ,谁有好方案?
206浏览 • 1回复 待解决
简单绘图板有人知道方法吗?
326浏览 • 1回复 待解决
版本新增taskpool相关功能验证
365浏览 • 1回复 待解决
taskPool @Concurrent报红
1134浏览 • 1回复 待解决
ListListItem组件使用
465浏览 • 1回复 待解决
taskPool参数支持Function类型吗
504浏览 • 1回复 待解决
taskpool异步任务支持串行处理方法
440浏览 • 1回复 待解决
新人求简单封装方法?
3192浏览 • 1回复 待解决
TaskPool线程内存如何共享
725浏览 • 1回复 待解决