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主线程?
376浏览 • 1回复 待解决
类似CallStateObserver中的回调,是在app主线程,还新的线程中?
5125浏览 • 1回复 待解决
HarmonyOS taskPool执行的task内如何回调主线程的方法
414浏览 • 1回复 待解决
libuv的简单实现,通过使用libuv库实现C++子线程操作
737浏览 • 1回复 待解决
HarmonyOS在异步线程往主线程抛任务无法被执行
279浏览 • 1回复 待解决
HarmonyOS ArkTS开发中,异步回调,怎么切到主线程执行呢
496浏览 • 1回复 待解决
在ArkTS的主线程中使用await会堵塞主线程吗
2069浏览 • 1回复 待解决
主线程怎么才能判断子线程是否已经执行结束了
6671浏览 • 1回复 待解决
Native子线程切回主线程传递的env是否会变化
1646浏览 • 1回复 待解决
sensor无论在子线程还是主线程都报错SENSOR_PARAMETER_ERROR
258浏览 • 1回复 待解决
子线程和主线程的优先级及任务执行策略是什么
1892浏览 • 1回复 待解决
HarmonyOS ArkTS怎么控制子线程回到主线程
466浏览 • 1回复 待解决
TaskPool子线程和主线程如何通信
2249浏览 • 1回复 待解决
zip包的解压是在主线程还是IO线程
1563浏览 • 1回复 待解决
请问如何判断当前执行的方法运行的子线程还是主线程,以及如何打印线程ID
160浏览 • 1回复 待解决
HarmonyOS可以在C代码中创建子线程吗?
2512浏览 • 1回复 待解决
宿主线程如何接收子线程发送的消息?
324浏览 • 1回复 待解决
HarmonyOS主线程的napi_ref是否可以被worker线程使用?
348浏览 • 1回复 待解决
HarmonyOS 并发任务子线程之间、子线程与主线程内容不共享问题
319浏览 • 1回复 待解决
c++模块在UI主线程如何进行消息循环?是libuv事件驱动么?
536浏览 • 1回复 待解决
HarmonyOS在Native层的其他的子线程的回调数据不能直接回抛给UI层,有没有好的办法?
253浏览 • 1回复 待解决
子线程和主线程之间的任务执行策略和优先级如何确定?
401浏览 • 1回复 待解决
宿主线程如何向worker子线程发送消息?
278浏览 • 1回复 待解决
HarmonyOS async/await promise是在哪个线程,如何判断主线程还是子线程
436浏览 • 1回复 待解决
延迟任务回调onWorkStart和onWorkStop是运行在主线程吗
1720浏览 • 1回复 待解决
主线程中此功能暂不支持,可以用以下方法代替
1. ffrt_get_main_queue()
2. ffrt_task_attr_set_queue_priority()
3. ffrt_task_attr_set_delay()
4. ffrt_queue_submit
目前只能通过ffrt的这些接口实现