HarmonyOS鸿蒙Next中taskpool无法调用对象成员函数

HarmonyOS鸿蒙Next中taskpool无法调用对象成员函数 taskpool调用对象成员函数会崩溃

4 回复

taskpool调用函数必须要使用@Concurrent,类里的方法暂不支持使用,以下链接可供您参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-taskpool-V5

更多关于HarmonyOS鸿蒙Next中taskpool无法调用对象成员函数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


asyncTask(action: number, params: Array<ValueType | object>) {
  let task: taskpool.Task = new taskpool.Task(handleTask);
  taskpool.execute(task).then(() => {
    console.log(`Task:${action} execute finish`);
  });
}

handleTask(action: number, params: Array<ValueType | object>) {
  
}

在HarmonyOS鸿蒙Next中,taskpool是用于多线程任务调度的模块,允许开发者将任务分发到不同的线程中执行。然而,taskpool目前不支持直接调用对象的成员函数。这是因为taskpool的任务调度机制要求任务函数必须是静态函数或全局函数,而不能直接绑定到对象的实例方法上。

具体来说,taskpool的任务函数需要符合TaskFunc类型的定义,即函数签名必须是void(*)(void*)。这意味着任务函数只能接受一个void*类型的参数,并且没有返回值。由于对象的成员函数隐含了this指针,无法直接转换为符合TaskFunc类型的函数。

要解决这个问题,可以将成员函数封装到一个静态函数或全局函数中,并将对象实例作为参数传递。例如:

class MyClass {
public:
    void MemberFunction(int arg) {
        // 成员函数的实现
    }
};

void TaskWrapper(void* arg) {
    auto* params = static_cast<std::pair<MyClass*, int>*>(arg);
    params->first->MemberFunction(params->second);
    delete params;
}

void ScheduleTask(MyClass* obj, int arg) {
    auto* params = new std::pair<MyClass*, int>(obj, arg);
    taskpool::Schedule(TaskWrapper, params);
}

在这个例子中,TaskWrapper是一个符合TaskFunc类型的全局函数,它通过void*参数接收对象实例和参数,并调用对象的成员函数。ScheduleTask函数负责将任务调度到taskpool中执行。

总结来说,taskpool无法直接调用对象成员函数,但可以通过封装为静态函数或全局函数的方式间接实现。

在HarmonyOS鸿蒙Next中,taskpool的并发任务默认使用序列化的方式传递参数,因此无法直接传递对象和调用其成员函数。解决方法是将对象成员函数转换为静态方法或普通函数,并通过传递对象实例来间接调用。例如,将成员函数提取为静态方法,然后在任务中调用该静态方法并传递对象实例。这样可以绕过序列化限制,实现并发任务中对对象成员函数的调用。

回到顶部