sd_event_state小小了解

代码

        do {
            state = sd_event_get_state(flutterpi.event_loop);
            switch (state) {
                case SD_EVENT_INITIAL:
                    ok = sd_event_prepare(flutterpi.event_loop);
                    if (ok < 0) {
                        LOG_ERROR("Could not prepare event loop. sd_event_prepare: %s\n", strerror(-ok));
                        return -ok;
                    }

                    break;
                case SD_EVENT_ARMED:
                    pthread_mutex_unlock(&flutterpi.event_loop_mutex);

                    do {
                        rfds = const_fds;
                        wfds = const_fds;
                        xfds = const_fds;
                        ok = select(evloop_fd + 1, &rfds, &wfds, &xfds, NULL);
                        if ((ok < 0) && (errno != EINTR)) {
                            perror("[flutter-pi] Could not wait for event loop events. select");
                            return errno;
                        }
                    } while ((ok < 0) && (errno == EINTR));

                    pthread_mutex_lock(&flutterpi.event_loop_mutex);

                    ok = sd_event_wait(flutterpi.event_loop, 0);
                    if (ok < 0) {
                        LOG_ERROR("Could not check for event loop events. sd_event_wait: %s\n", strerror(-ok));
                        return -ok;
                    }

                    break;
                case SD_EVENT_PENDING:
                    ok = sd_event_dispatch(flutterpi.event_loop);
                    if (ok < 0) {
                        LOG_ERROR("Could not dispatch event loop events. sd_event_dispatch: %s\n", strerror(-ok));
                        return -ok;
                    }

                    break;
                case SD_EVENT_FINISHED:
                    break;
                default:
                    LOG_ERROR("Unhandled event loop state: %d. Aborting\n", state);
                    abort();
            }
        } while (state != SD_EVENT_FINISHED);

状态说明:

		8.1.1 SD_EVENT_INITIAL: 开始迭代处理事件之前的状态,
		    此状态需要调用sd_event_prepare()让event_loop转换为SD_EVENT_ARMED
		    或者SD_EVENT_PENDING状态
		      
		8.1.2 SD_EVENT_PREPARING: 正在准备事件源,即当前正在执行准备处理程序,
			这个状态尽在sd_event_prepare()被调用之后可见,
			此状态之后紧跟着的是SD_EVENT_ARMED 或者 SD_EVENT_PENDING。
		      
		8.1.3 SD_EVENT_ARMED: sd_event_prepare()已经被调用,并且没有事件被分发时处于该状态。
			调用sd_event_wait等待事件,之后转换为SD_EVENT_PENDING, 或者返回SD_EVENT_INITIAL状态
		      
		8.1.4 SD_EVENT_PENDING: 调用sd_event_prepare()或者sd_event_wait()之后,
			且有事件待办处于该状态。调用sd_event_dispatch()去分发(处理)高优先级的事件,
			并且转换为SD_EVENT_FINISH状态或者回退到SD_EVENT_INITIAL状态。
		      
		8.1.5 SD_EVENT_RUNNING: 事件源正在被分发中(处理中),
			这个状态只会在sd_event_dispatch()被调用之后出现,
			并且消息处理之后紧随的消息是SD_EVENT_INITIAL或者SD_EVENT_FINISHED。
			如果在分发(处理)期间退出事件处理,则之后的状态是SD_EVENT_EXITING。
		      
		8.1.6 SD_EVENT_EXITING: 在事件调度退出之后生效的状态,
			其之后跟随的状态是SD_EVENT_INITIAL活SD_EVENT_FINISHED。
		
		8.1.7 SD_EVENT_FINISHED: 事件循环已推出,所有事件源都已经运行,
			如果处于该状态,它就不在有任何用途了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值