HarmonyOS 线程相关问题

1.有什么方法能block taskpool任务的方法吗?类似Thread.sleep(1000);

@Concurrent 
function startCheckBuffer(....): void { 
  const TAG = '[BaseTester]'; 
  ..... 
  //Thread.sleep(1000);? 
}

2.taskpool和worker在同一个Event Loop队列里吗?

worker线程下创建taskpool子任务 两者代码并行执行 但是taskpool的返回得在worker线程执行完毕之后才能print 这是为什么。

如果我的场景是 worker线程在执行的过程中,需要开启一个检查任务,如果检查任务内部条件满足要求 立即返回影响worker执行逻辑,这种场景下actor线程模型,该怎么办。共享模型直接修改就行了,但是这种event loop的模型怎么办呢?

HarmonyOS
2024-08-28 17:37:36
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

1、暂时没有类似Thread.sleep接口。

如果想要延迟执行一些逻辑,可以参考js的setTimeout或者异步调用之类的。

或者可以尝试下面这个方法。

let sharedBuf = new SharedArrayBuffer(4) 
let sharedArr = new Int32Array(sharedBuf) 
Atomics.wait(sharedArr, 0, 0, 5000)

2、由于没有代码,从表现上看,猜测是因为taskpool.execute是异步执行的,而worker里的都是同步代码,这就涉及到js的事件循环机制,可以先了解下。

从描述场景来看,需要结合promise去使用,例如在taskpool中执行该有的逻辑,满足条件就修改了一个公共变量,worker中用到该变量的地方后续逻辑就会变化

// worker内部分代码示例 
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS'; 
import { taskpool } from '@kit.ArkTS'; 
@Concurrent 
async function testTaskPool(): Promise<number> { 
  const res: number = await new Promise((reslove, reject) => { 
    setTimeout(() => { 
      // 假设是修改公共变量逻辑,一般需要是从别的文件导入的逻辑,@Concurrent使用详情查看https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ArkTS-concurrent-0000001774120106 
      reslove(666); 
    }, 2000) 
  }) 
  return res; 
} 
 
async function TaskPoolTest(): Promise<number> { 
  try { 
    let task: taskpool.Task = new taskpool.Task(testTaskPool); 
    const result = await taskpool.execute(task) as number; 
    console.info("taskpool res is: " + result); 
    return result; 
  } catch (e) { 
    console.error("taskpool execute error is: " + e); 
    return 0; 
  } 
} 
const workerPort: ThreadWorkerGlobalScope = worker.workerPort; 
/** 
 
 Defines the event handler to be called when the worker thread receives a message sent by the host thread. 
 The event handler is executed in the worker thread. 
 
 @param e message data 
 
 */ 
workerPort.onmessage = async (e: MessageEvents) => { 
  // data:主线程发送的信息 
  let data: string = e.data; 
  console.log("worker.ets onmessage"); 
  // 如果需要taskpool阻塞住worker逻辑,就加上await 
  //await TaskPoolTest(); 
  TaskPoolTest(); 
  // 假设这里有根据公共变量不同而不同操作的逻辑 
  console.log("worker.ets after taskpool"); 
  // worker线程向主线程发送信息 
  workerPort.postMessage("123") 
}
分享
微博
QQ
微信
回复
2024-08-28 22:39:03
相关问题
HarmonyOS线程并发相关问题
83浏览 • 1回复 待解决
HarmonyOS线程线程切换问题
396浏览 • 1回复 待解决
HarmonyOS protobuf相关问题
294浏览 • 1回复 待解决
HarmonyOS RN相关问题
333浏览 • 1回复 待解决
HarmonyOS音频相关问题
349浏览 • 1回复 待解决
HarmonyOS 地图相关问题
432浏览 • 1回复 待解决
HarmonyOS AccountKit相关问题
311浏览 • 1回复 待解决
HarmonyOS 证书相关问题
268浏览 • 1回复 待解决
HarmonyOS KVStore 相关问题
70浏览 • 1回复 待解决
HarmonyOS BindSheet相关问题
217浏览 • 1回复 待解决
HarmonyOS Grid相关问题
257浏览 • 1回复 待解决
HarmonyOS 线程切换问题
360浏览 • 1回复 待解决
HarmonyOS 列表List相关问题
213浏览 • 1回复 待解决
HarmonyOS 视频录制相关问题
259浏览 • 0回复 待解决
HarmonyOS图片上传相关问题
329浏览 • 1回复 待解决
HarmonyOS NAPI开发相关问题
263浏览 • 1回复 待解决
HarmonyOS 弹窗的相关问题
184浏览 • 1回复 待解决
HarmonyOS 路径动画相关问题
460浏览 • 1回复 待解决
HarmonyOS Video组件相关问题
261浏览 • 1回复 待解决
HarmonyOS 路由栈相关问题
124浏览 • 1回复 待解决
HarmonyOS文件读写相关问题
383浏览 • 1回复 待解决
HarmonyOS dialog弹窗相关问题
284浏览 • 1回复 待解决
HarmonyOS AOT相关问题咨询
255浏览 • 1回复 待解决
HarmonyOS emitter 线程切换问题
253浏览 • 1回复 待解决