HarmonyOS在异步线程往主线程抛任务无法被执行

1. 实现自定义message loop机制:通过 napi_env 拿到 akui线程的loop,然后监听 timerfd 文件描述符。

2. 现象是在异步线程中抛任务到主线程,发现无法执行。

3. 如果在外边包一层 setTimeout,就发现异步任务可以抛给主线程。

Button("PostTask(再点我)") 
  .fontSize(50) 
  .fontWeight(FontWeight.Bold) 
  .onClick(() => { 
    //// 收到 ” post message Received success!!!! “ 这个日志代表正确 
    /// 如果直接这样调用, C层的日志无法成功打印 (任务无法抛到主线程) 
    testNapi.post(); 
    //// 如果直接这样调用, C层的日志可以成功打印  
    // setTimeout(()=>{ 
    //   testNapi.post(); 
    // }, 0); 
 
  })

预期收到如下三个日志:

05-16 18:00:20.448   36132-36132  A04001/PostTaskIssue           com.xxx.posttask   E     Init success!!!! 
05-16 18:00:22.731   36132-36132  A04001/PostTaskIssue           com.xxx.posttask   E     Post message executed 
05-16 18:00:22.733   36132-36132  A04001/PostTaskIssue           com.xxx.posttask   E     post message Received success!!!!
HarmonyOS
2024-08-28 09:04:39
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

系统抛异步任务是会在ffrt线程中执行一次uv_async_send触发一次fd事件。由于双loop的弊端,现在ffrt执行完任务以后,会将主线程的回调提交给eventhandler,不再执行uv_async_send。因此不再触发fd事件,那个uv_poll_start接口就不会生效。针对这个问题,是因为timer定时器里面有触发fd的动作。

分享
微博
QQ
微信
回复
2024-08-28 22:26:23
相关问题
异步是否对主线程有影响
222浏览 • 1回复 待解决
HarmonyOS线程池周期执行任务
556浏览 • 1回复 待解决
HarmonyOS主线程线程切换问题
151浏览 • 1回复 待解决
zip包的解压是主线程还是IO线程
1437浏览 • 1回复 待解决
延迟任务执行时机及运行线程
1794浏览 • 1回复 待解决
Worker的宿主线程必须是主线程吗?
171浏览 • 1回复 待解决
TaskPool子线程主线程如何通信
1993浏览 • 1回复 待解决
如何判断当前线程是否是主线程
2001浏览 • 1回复 待解决
怎样判断当前线程是否是主线程
193浏览 • 1回复 待解决