HarmonyOS 鸿蒙Next 未什么taskpool和worker线程中无法获取宿主线程中的数据

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 未什么taskpool和worker线程中无法获取宿主线程中的数据

代码如下。

@Entry
@Component
struct Index {
@State message: string = ‘Hello World’;

aboutToAppear(): void {
// 线程
// const workerInstance = new worker.ThreadWorker(‘entry/ets/workers/Worker.ets’);
// Info.deviceId = “123456789”
// workerInstance.postMessage(Info.deviceId);
// workerInstance.onmessage = (data: MessageEvent<string>): void => {
// console.log(data.data.toString());
// }
}

build() {
Row() {
Button(“测试线程”).onClick(() => {
// try {
// const downloadPath = Environment.getUserDownloadDir();
// console.info(Success to getUserDownloadDir: ${downloadPath});
// let fileList: string[] = fileIo.listFileSync(downloadPath);
// fileList.forEach((file, index) => {
// console.log(file);
// })
// } catch (e) {
// console.error(异常:${e.message});
// ToastUtil.showToast(${e.message});
// }
try{
Info.deviceId = “123456789”
let task: taskpool.Task = new taskpool.Task(taskSum, 1, 2);
taskpool.execute(task);
console.info(执行完成);
}catch(e) {
console.error(失败:${e.message})
}
console.info(“主线程不阻塞”);
})
}.height(‘100%’)
}
}

@Concurrent
function taskSum(num1: number, num2: number) {
setTimeout(() => {
let sum = num1 + num2;
console.info(总计:${sum}, deviceId: ${Info.deviceId});
}, 2000);
}

打印Info.deivceId时是空值。

2 回复
你的Info哪里来的?

在HarmonyOS鸿蒙系统中,taskpool和worker线程与宿主线程(通常指创建并管理这些线程的主线程)之间运行在不同的执行上下文中。由于这种隔离机制,直接访问宿主线程中的数据可能受到限制或不可行,这通常是为了保证系统的稳定性和数据的一致性。

具体来说,taskpool和worker线程的设计目的是为了提高并发处理能力和资源利用率,它们通过任务队列来管理和调度工作。这种设计模式意味着,线程间的数据交互需要通过特定的同步机制或数据共享机制来实现,而不是直接访问。

如果你尝试在taskpool或worker线程中直接访问宿主线程中的数据,可能会遇到访问权限问题、数据竞争或不一致性问题。因此,建议使用线程安全的数据结构(如队列、信号量等)或通过消息传递机制来实现线程间的数据共享。

如果上述解释仍无法解决你的问题,可能是因为你的具体实现中存在一些特殊情况或配置问题。此时,建议检查你的代码和配置,确保遵循了HarmonyOS鸿蒙系统的线程管理规范。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部