cocos-engine icon indicating copy to clipboard operation
cocos-engine copied to clipboard

Need worker port export in harmony os and better functions to call thread

Open iwae opened this issue 6 months ago • 1 comments

Use Case

it's too hard to call worker port in ark TS and add new statement.

Image

Problem Description

too hard to use in cocos worker, this file will be rebuild everytime

Proposed Solution

some suggestion like, to use map to add new statement // 消息处理器映射表 const messageHandlers = new Map(); /**

  • 消息处理器类型定义 */ type MessageHandler = (param: any) => void;

/**

  • WorkerPort 接口定义 / export interface IWorkerPort { /*
    • 原始 workerPort 引用 */ port: any; // 使用 worker.WorkerPort 类型,如果有定义的话

/**

  • 注册消息处理器
  • @param messageName 消息名称
  • @param handler 处理函数
  • @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort;

/**

  • 移除消息处理器
  • @param messageName 消息名称
  • @returns this 支持链式调用 */ off(messageName: string): IWorkerPort;

/**

  • 处理消息
  • @param messageName 消息名称
  • @param param 消息参数
  • @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean;

/**

  • 转发原始 postMessage 方法
  • @param message 消息内容 */ postMessage(message: any): void;

/**

  • 注册消息处理器,当接收到指定消息时调用Cocos函数
  • @param messageName 消息名称
  • @param functionName Cocos环境中的函数名
  • @param params 要传递给函数的参数(可选)
  • @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort; }

export const WorkerPort: IWorkerPort = { /**

  • 原始 workerPort 引用 */ port: worker.workerPort,

/**

  • 注册消息处理器
  • @param messageName 消息名称
  • @param handler 处理函数
  • @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort { messageHandlers.set(messageName, handler); return this; },

/**

  • 移除消息处理器
  • @param messageName 消息名称
  • @returns this 支持链式调用 */ off(messageName: string): IWorkerPort { messageHandlers.delete(messageName); return this; },

/**

  • 处理消息
  • @param messageName 消息名称
  • @param param 消息参数
  • @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean { if (messageHandlers.has(messageName)) { const handler = messageHandlers.get(messageName); handler(param); return true; } return false; },

/**

  • 转发原始 postMessage 方法
  • @param message 消息内容 / postMessage(message: any): void { worker.workerPort.postMessage(message); }, /*
  • 注册消息处理器,当接收到指定消息时调用Cocos函数
  • @param messageName 消息名称
  • @param functionName Cocos环境中的函数名
  • @param params 要传递给函数的参数(可选)
  • @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort { this.on(messageName, (params) => { // 如果提供了固定参数,则使用固定参数 const jsCode = ${functionName}('${params}'); cocos.evalString(jsCode); }); return this; },

};

How it works

No response

Alternatives Considered

some suggestion like, to use map to add new statement // 消息处理器映射表 const messageHandlers = new Map(); /**

  • 消息处理器类型定义 */ type MessageHandler = (param: any) => void;

/**

  • WorkerPort 接口定义 / export interface IWorkerPort { /*
    • 原始 workerPort 引用 */ port: any; // 使用 worker.WorkerPort 类型,如果有定义的话

/**

  • 注册消息处理器
  • @param messageName 消息名称
  • @param handler 处理函数
  • @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort;

/**

  • 移除消息处理器
  • @param messageName 消息名称
  • @returns this 支持链式调用 */ off(messageName: string): IWorkerPort;

/**

  • 处理消息
  • @param messageName 消息名称
  • @param param 消息参数
  • @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean;

/**

  • 转发原始 postMessage 方法
  • @param message 消息内容 */ postMessage(message: any): void;

/**

  • 注册消息处理器,当接收到指定消息时调用Cocos函数
  • @param messageName 消息名称
  • @param functionName Cocos环境中的函数名
  • @param params 要传递给函数的参数(可选)
  • @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort; }

export const WorkerPort: IWorkerPort = { /**

  • 原始 workerPort 引用 */ port: worker.workerPort,

/**

  • 注册消息处理器
  • @param messageName 消息名称
  • @param handler 处理函数
  • @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort { messageHandlers.set(messageName, handler); return this; },

/**

  • 移除消息处理器
  • @param messageName 消息名称
  • @returns this 支持链式调用 */ off(messageName: string): IWorkerPort { messageHandlers.delete(messageName); return this; },

/**

  • 处理消息
  • @param messageName 消息名称
  • @param param 消息参数
  • @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean { if (messageHandlers.has(messageName)) { const handler = messageHandlers.get(messageName); handler(param); return true; } return false; },

/**

  • 转发原始 postMessage 方法
  • @param message 消息内容 / postMessage(message: any): void { worker.workerPort.postMessage(message); }, /*
  • 注册消息处理器,当接收到指定消息时调用Cocos函数
  • @param messageName 消息名称
  • @param functionName Cocos环境中的函数名
  • @param params 要传递给函数的参数(可选)
  • @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort { this.on(messageName, (params) => { // 如果提供了固定参数,则使用固定参数 const jsCode = ${functionName}('${params}'); cocos.evalString(jsCode); }); return this; },

};

Additional Information

No response

iwae avatar May 20 '25 06:05 iwae

https://github.com/cocos/cocos-engine/pull/18743

qiuguohua avatar Jun 12 '25 00:06 qiuguohua