HarmonyOS 线程相关问题

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

@Concurrent 
function startCheckBuffer(....): void { 
  const TAG = '[BaseTester]'; 
  ..... 
  //Thread.sleep(1000);? 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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)
  • 1.
  • 2.
  • 3.

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") 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
分享
微博
QQ
微信
回复
2024-08-28 22:39:03


相关问题
HarmonyOS线程并发相关问题
982浏览 • 1回复 待解决
HarmonyOS线程线程切换问题
1669浏览 • 1回复 待解决
HarmonyOS 线程切换问题
1158浏览 • 1回复 待解决
HarmonyOS Grid相关问题
1270浏览 • 1回复 待解决
HarmonyOS KVStore 相关问题
1038浏览 • 1回复 待解决
HarmonyOS Lib相关问题
719浏览 • 1回复 待解决
HarmonyOS string相关问题
946浏览 • 1回复 待解决
HarmonyOS BindSheet相关问题
1435浏览 • 1回复 待解决
HarmonyOS 证书相关问题
1059浏览 • 1回复 待解决
HarmonyOS Worker相关问题
918浏览 • 1回复 待解决
HarmonyOS AccountKit相关问题
1242浏览 • 1回复 待解决
HarmonyOS 混淆相关问题
793浏览 • 1回复 待解决
HarmonyOS 地图相关问题
1555浏览 • 1回复 待解决
HarmonyOS RelativeContainer相关问题
736浏览 • 1回复 待解决
HarmonyOS PushExtensionAbility相关问题
840浏览 • 1回复 待解决
HarmonyOS CardRecognition相关问题
940浏览 • 1回复 待解决
HarmonyOS ApplicationContext相关问题
1032浏览 • 1回复 待解决
HarmonyOS 打包相关问题
956浏览 • 1回复 待解决
HarmonyOS @Event相关问题
933浏览 • 1回复 待解决
适配HarmonyOS相关问题
991浏览 • 1回复 待解决
HarmonyOS RN相关问题
1416浏览 • 1回复 待解决
HarmonyOS音频相关问题
1520浏览 • 1回复 待解决
HarmonyOS protobuf相关问题
1291浏览 • 1回复 待解决