HarmonyOS libuv实现的timer,在主线程执行没有回调,在子线程可以正常使用
#include "napi/native_api.h" 
 
#include <uv.h> 
#include <chrono> 
#include <memory> 
#include <functional> 
#include <hilog/log.h> 
 
#include <thread> 
 
  using Duration = std::chrono::nanoseconds; 
using Seconds = std::chrono::seconds; 
using Milliseconds = std::chrono::milliseconds; 
using Microseconds = std::chrono::microseconds; 
using Nanoseconds = std::chrono::nanoseconds; 
 
 
class Timer { 
  public: 
    class Impl { 
  public: 
    Impl(uv_loop_t *loop) : loop_(loop) { 
  timer_ = new uv_timer_t; 
  timer_->data = this; 
  uv_timer_init(loop_, timer_); 
} 
 
  ~Impl() { 
  uv_timer_stop(timer_); 
  uv_close(reinterpret_cast<uv_handle_t *>(timer_), 
    [](uv_handle_t *handle) { delete reinterpret_cast<uv_timer_t *>(handle); }); 
} 
 
  void start(std::chrono::milliseconds timeout, std::chrono::milliseconds repeat, 
  std::function<void()> &&callback) { 
  callback_ = std::move(callback); 
  uv_timer_start( 
  timer_, 
  [](uv_timer_t *handle) { 
  auto *impl = static_cast<Impl *>(handle->data); 
  impl->callback_(); 
}, 
timeout.count(), repeat.count()); 
} 
 
void stop() { uv_timer_stop(timer_); } 
 
private: 
  uv_loop_t *loop_; 
uv_timer_t *timer_; 
std::function<void()> callback_; 
}; 
 
Timer(uv_loop_t *loop) : mImplPtr(std::make_unique<Impl>(loop)) {} 
 
~Timer() = default; 
 
void start(std::chrono::milliseconds timeout, std::chrono::milliseconds repeat, std::function<void()> &&callback) { 
  mImplPtr->start(timeout, repeat, std::move(callback)); 
} 
 
void stop() { mImplPtr->stop(); } 
 
private: 
  std::unique_ptr<Impl> mImplPtr; 
}; 
 
void testTimerInSubThread() { 
  std::thread timerThread([]() { 
    uv_loop_t loop; 
    uv_loop_init(&loop); 
 
    Timer timer(&loop); 
    timer.start(std::chrono::milliseconds(1000), std::chrono::milliseconds(1000), 
    []() { OH_LOG_Print(LOG_APP, LOG_ERROR, 0, "timer callback", "==================="); }); 
 
    uv_run(&loop, UV_RUN_DEFAULT); 
  }); 
  timerThread.detach(); 
} 
 
void testTimerInMainThread(napi_env env) { 
  uv_loop_t* loop; 
  if (napi_ok != napi_get_uv_event_loop(env, &(loop))) { 
    throw std::runtime_error("Failed to get main loop."); 
  } 
 
  bool isActive = uv_loop_alive(loop); 
  OH_LOG_Print(LOG_APP, LOG_ERROR, 0, "loop ", "init:%{public}d\n", isActive); 
  static Timer timer(loop); 
  timer.start(Seconds::zero(), Seconds(2), 
  []() { OH_LOG_Print(LOG_APP, LOG_ERROR, 0, "timer callback", "==================="); }); 
}主线程执行testTimerInMainThread, timer没有回调执行testTimerInSubThread可以正常回调
        HarmonyOS
      
        赞
        
 收藏 0
 回答 1
 
        待解决
        
相关问题
 在C++回调时,如何阻塞TS主线程? 
1860浏览  • 1回复 待解决
类似CallStateObserver中的回调,是在app主线程,还新的线程中? 
6502浏览  • 1回复 待解决
HarmonyOS taskPool执行的task内如何回调主线程的方法 
1950浏览  • 1回复 待解决
HarmonyOS 如何判断当前任务在主线程还是在子线程 
1154浏览  • 1回复 待解决
HarmonyOS在异步线程往主线程抛任务无法被执行 
1467浏览  • 1回复 待解决
libuv的简单实现,通过使用libuv库实现C++子线程操作 
1743浏览  • 1回复 待解决
HarmonyOS ArkTS开发中,异步回调,怎么切到主线程执行呢 
2397浏览  • 1回复 待解决
在ArkTS的主线程中使用await会堵塞主线程吗 
3393浏览  • 1回复 待解决
在Native层使用IPC Kit时,如何管理线程以避免阻塞主线程?是否提供线程池或异步回调机制? 
619浏览  • 0回复 待解决
Native子线程切回主线程传递的env是否会变化 
2741浏览  • 1回复 待解决
主线程怎么才能判断子线程是否已经执行结束了 
8072浏览  • 1回复 待解决
HarmonyOS 有没有类似的主线程提供一个idle的时机,类似主线程不繁忙的时候的回调。 
851浏览  • 1回复 待解决
sensor无论在子线程还是主线程都报错SENSOR_PARAMETER_ERROR 
1217浏览  • 1回复 待解决
HarmonyOS 在native侧开发,c++多线程开发中,子线程中如何丢一个任务到主线程中执行 
970浏览  • 1回复 待解决
子线程和主线程的优先级及任务执行策略是什么 
3019浏览  • 1回复 待解决
请问如何判断当前执行的方法运行的子线程还是主线程,以及如何打印线程ID 
1368浏览  • 1回复 待解决
TaskPool子线程和主线程如何通信 
3719浏览  • 1回复 待解决
HarmonyOS  ArkTS怎么控制子线程回到主线程 
2228浏览  • 1回复 待解决
zip包的解压是在主线程还是IO线程 
2632浏览  • 1回复 待解决
#鸿蒙通关秘籍#在鸿蒙开发中实现子线程与主线程的同步调用的关键步骤? 
1719浏览  • 1回复 待解决
宿主线程如何接收子线程发送的消息? 
1498浏览  • 1回复 待解决
HarmonyOS 能够在主线程给 Worker 传递一个函数,让这个函数在 Worker 的线程中执行么? 
1052浏览  • 1回复 待解决
c++模块在UI主线程如何进行消息循环?是libuv事件驱动么? 
1512浏览  • 1回复 待解决
HarmonyOS Worker主线程和子线程共享对象问题 
1358浏览  • 1回复 待解决





















主线程中此功能暂不支持,可以用以下方法代替
1. ffrt_get_main_queue()
2. ffrt_task_attr_set_queue_priority()
3. ffrt_task_attr_set_delay()
4. ffrt_queue_submit
目前只能通过ffrt的这些接口实现