evnet 主循环

当兵心理测试软件,当兵心理测试题及答案 心理测试是一种比较先进的测试方法,它是指通过一系列手段,将人的某些心理特征数量化,来衡量个体心理因素水平和个体心理差异差异的一种科学测量方法。小编为你整理了当兵心理测试题及答案,希望对你有所参考帮助。征兵心理测试题(1代表是2代表否)1、我的胃口很好。12、我早上起来的时候,多半觉得睡眠充足,头脑清醒13、我喜欢看报纸上的犯罪新闻。14、有时我常感到困难重重,无法克服。25、我时常遇见一些所谓的专... 阅读详情

搞清楚前面已经分析的事件的注册和注销两方面, 相信你对libevent已经有了一定的认识了, 而本节将来分析调用过程中很重要的功能, 他叫做主循环.

主循环主要执行的工作就是将就绪队列中的事件全部激活执行调度. 感觉是不是重心啊? 激活事件耶, 就是执行回调呀. 但是我们的event和event_base中可以包含的事件可以是 IO, 信号, 定时那么这些具体怎么柔和到一起进行处理呢? 接下来我们就来看一下吧.

event_base_loop 函数

代码量有点大, 但是没关系, 只要仔细分析每一步实现的功能在大致从头分析一下应该都能够理清楚思路.

// 主循环
// 1. 设置退出标志位, 则退出主循环
// 2. 主循环被阻塞直到有就绪事件或者非阻塞
// 3. 将超时事件加入就绪队列中
// 4. 如果就绪队列有事件并且执行完或者设置是非阻塞, 则退出主循环
int
event_base_loop(struct event_base *base, int flags)
{
	const struct eventop *evsel = base->evsel;	// base 的复用功能的函数
	void *evbase = base->evbase;	// 复用功能函数指定的参数
	struct timeval tv;
	struct timeval *tv_p;
	int res, done;

	/* clear time cache */
	base->tv_cache.tv_sec = 0;	// 清除 base 中的时间

	// 如果设置有信号事件, 就将 base 交给专门处理信号的结构处理
    // 将信号单独作处理
	if (base->sig.ev_signal_added)
		evsignal_base = base;
	done = 0;
	while (!done) {
		/* Terminate the loop if we have been asked to */
		// 如果设置了退出标志位, 就会退出主循环
		if (base->event_gotterm) {
			base->event_gotterm = 0;
			break;
		}

		if (base->event_break) {
			base->event_break = 0;
			break;
		}

		/* You cannot use this interface for multi-threaded apps */
        // 这个我们不分析. 就是处理信号
		while (event_gotsig) {
			event_gotsig = 0;
			if (event_sigcb) {
				res = (*event_sigcb)();
				if (res == -1) {
					errno = EINTR;
					return (-1);
				}
			}
		}

		// 每次都会矫正时间
		timeout_correct(base, &tv);

		tv_p = &tv;
		// 如果没有就绪事件并且设置的阻塞模式, 则调用 timeout_next 计算最近的计时器
		// 什么时候超时, 如果没有定时器则 tv_p == NULL
		// 如果设置了为非阻塞模式, 则不会计算最近计时器触发的时间. 一般非阻塞模式都
		// 是在并发量大的情况下, 否则纯粹是浪费 CPU 
		if (!base->event_count_active && !(flags & EVLOOP_NONBLOCK)) {
			timeout_next(base, &tv_p);
		} else {
			/* 
			 * if we have active events, we just poll new events
			 * without waiting.
			 */
            // tv->tv_sev = tv->tv_usec = 0;
		      // 有事件或者非阻塞则立即返回
			evutil_timerclear(&tv);
		}
		
		/* If we have no events, we just exit */
		if (!event_haveevents(base)) {
			event_debug(("%s: no events registered.", __func__));
			return (1);
		}

		/* update last old time */
		gettime(base, &base->event_tv);

		/* clear time cache */
		base->tv_cache.tv_sec = 0;

        // 调用的是某种具体的多路IO机制的等待函数, 如 : epoll的epoll_wait函数
		res = evsel->dispatch(base, evbase, tv_p);

		if (res == -1)
			return (-1);
		// 缓存当前时间
		gettime(base, &base->tv_cache);

		// 如果有(超时)被激活的事件, 就将事件从最小堆中移除并加入到就绪队列中
		timeout_process(base);

		// 就绪队列中有事件, 则将事件进行处理. 
		// 如果就绪队列非空 或者 当前状态是非阻塞则退出主循环
		if (base->event_count_active) {
			event_process_active(base);
			if (!base->event_count_active && (flags & EVLOOP_ONCE))
				done = 1;
		} else if (flags & EVLOOP_NONBLOCK)
			done = 1;
	}

	/* clear time cache */
	base->tv_cache.tv_sec = 0;

	event_debug(("%s: asked to terminate loop.", __func__));
	return (0);
}

不明白的地方可能会有一点的多, 但是有些我们就没必须区深究,如 : 信号处理, 时间获取. 现在把大概的过程理一下

  1. 如果到来的是信号, 则由libevent的全局变量evsignal_base 指向.
  2. 如果设置了event_base中的退出主循环标志, 则退出主循环. (在event_base结构提过, 待会具体分析).
  3. 矫正时间并将时间保存起来.
  4. 如果就绪队列没有事件, 并且设置的是阻塞. 那么调用 timeout_next 计算最近的计时器什么时候超时(也就是找出快要超时的或者已经超时的事件). 如果就绪队列中有事件或者是非阻塞的则将tv清零.
  5. 调用dispath函数, 如果没有就绪事件则退出, 否则调用 IO 多路函数等待事件(这里将dispath是将select和epoll等调用函数封装了, 如 ;epoll就是调用epoll_wait函数等待).
  6. 最后, 如果就绪队列有事件则处理事件处理完退出主循环, 或者没有就绪事件设置非阻塞则直接退出主循环.

啊啊啊, 终于理出来了. 确实写出来还是有一点多哦. 其实可以看出来主循环就是将超时事件加入就绪队列接着将就绪队列的事件全部处理掉再退出主循环. 不管是IO 还是时间都是加入到就绪队列一并处理了. (信号暂时不管)

接着我们来分析退出主循环的几个方式.

  1. 如果没有就绪事件或者设置为非阻塞都会正常退出主循环.
  2. 如果设置了event_break和event_gotterm标志, 就会直接退出循环, 非正常的

下节我们来分析怎样设置非正常退出的标志

调用主循环

可能你看到调用主循环有点懵逼, 上面event_base_loop不就是主循环啊, 直接调用就行了啊. 但是不要忘了直接调用的话需要我们传入event_base结构啊, 但是用户万一传错了怎么办, 所以libevent对主循环有一个简单的调用方法.

int
event_dispatch(void)
{
    return (event_loop(0));
}
int
event_loop(int flags)
{
    return event_base_loop(current_base, flags);	// 调用libevent的全局 event_base变量
}

直接调用event_dispatch即可, 也可以调用event_base_dispatch

int
event_base_dispatch(struct event_base *base)
{
    return event_base_loop(base, 0);
}

总结

理解清楚主循环是为了处理就绪事件, 没有就绪事件或者设置退出标志就会退出主循环.

【系列05】端侧AI:构建与部署高效的本地化AI模型 第4章:模型量化(Quantization) 量化的基本思想是减少模型中用于表示参数和激活值的比特数。在模型训练时,参数通常使用32位浮点数(FP32)进行存储,这提供了高精度,但也消耗大量的内存和计算资源。量化则将这些32位浮点数转换成低比特数表示,通常是8位整数(INT8)。量化的原理可以概括为:对浮点数范围进行校准,并将其映射到更小的整数范围内。例如,将一个FP32的权重(如-1.5到1.5)映射到INT8的范围(-128到127)。在推理过程中,模型将使用这些低精度的整数进行计算,从而大大减少了所需的计算量。量化带来的主要收益减少模型大小。 阅读详情

相关推荐

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 734

GTK+主循环(main loop)的工作原理 [zt]

GTK+主循环(main loop)的工作原理GTK+主循环(main loop)的工作原理 转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd作者联系方式:Li XianJing <xianjimli at hotmail dot com>更新时间:2007-3-17 我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自...

weixin_34007020的博客 934

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 369

GameFramework框架 (四) Evnet组件 EventComponent

GameFramework框架笔记,Event组件

weixin_36961960的博客 1538

在Modelsim中手动添加仿真库

缘由:在使用rom ip核的时候发现仿真需要altera_mf库的支持,而我的ModelSim没有这个库,所以想写一篇手动添加仿真库的文章方便自己以后使用:首先新建一个库,名字叫做altera_mf:然后编译对应的库文件:这里altera_mf.v文件是在quartus安装路径下quartus\eda\sim_lib文件夹下,点击编译后退出:最后在modelsim->example文件夹下可以找到编译好的库文件:

欢迎一起交流问题! 3402

【UE5】【蓝图】 LevelSequence 动画播放与暂停

最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。

UE5开发备忘录 1万+

游戏主循环(Game Loop)的详细解析

译自:https://dewitters.com/dewitters-gameloop/ 1. 引言   游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。   由于我身为游戏程序员,我见过许许多多的手机小游戏的代码。这些代码给我展示...

Zzz的专栏 1万+

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3396

Phonon主循环

。

lielie12138的博客 542

别再傻傻分不清!用R语言5分钟搞定RR、AR、OR的计算与解读(附代码)

本文通过R语言实战演示,详细讲解了RR(相对风险)、AR(绝对风险)和OR(比值比)的计算方法与科学解读。提供完整的代码示例和可视化技巧,帮助医学研究者快速掌握这些核心流行病学指标的应用与常见陷阱规避。

weixin_42526015的博客 265

Drools vs URule:5个真实项目场景告诉你如何选择开源规则引擎

本文通过电商风控、物流计费、会员体系、保险定价和物联网告警五个真实项目场景,深度对比了Drools与URule两款开源规则引擎。分析了两者在规则复杂度、性能表现、开发运维及适用场景上的核心差异,为技术选型提供基于实战的决策指南。

k6l7m8n9的博客 944

游戏主循环

现在位置:主页>C++博客> 文章内容 [翻译]游戏主循环 更新日期:2009-09-02 点击:13 原文地址 http://dewitters.koonsolo.com/gameloop.html 游戏主循环 引言 游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜...

weixin_30314813的博客 239

【Claude】Disabled organization 错误:组织被禁用的原因与 API Key 绕过方法

如果环境变量存在,下一步是找出它在哪里被设置的。"Disabled organization" 错误的本质不是账户被封,而是认证优先级冲突。环境变量优先级最高始终覆盖 OAuth 订阅认证报错信息具有误导性:"组织被禁用"指的通常是 API Key 所属的组织,而不是你的个人账户旧 Key 是隐形炸弹:即使你已经不再使用某个组织的 API,只要环境变量中残留该 Key,它就会持续覆盖你的订阅认证非交互模式更敏感claude -p模式下,只要有环境变量,就会强制使用它,完全忽略/login。

博客 8865

Unity集成视觉语言模型:实现游戏角色实时视觉理解与智能交互

视觉语言模型(VLM)作为多模态人工智能的核心技术,通过融合计算机视觉与自然语言处理,使机器能够理解图像内容并用自然语言进行描述。其原理基于Transformer架构,通过预训练学习视觉与文本特征的联合表示,实现跨模态语义对齐。这项技术的核心价值在于为各类应用提供了“视觉认知”能力,极大拓展了人机交互的边界。在游戏开发领域,VLM可用于创建能实时“看见”并理解游戏画面的智能NPC,实现动态、情境化的交互反馈。本文以Unity引擎为例,结合Qwen2-VL-2B模型与腾讯云GME语音引擎,详细讲解了如何构建一

weixin_30292745的博客 604

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

(八)事件主循环

前言上一小节我们介绍了事件是如何注册/注销的,在本小节中,我们将进一步探讨事件从未注册到处理的整个过程,即事件的主循环。事件主循环事件的主循环主要是通过event_base_loop完成的。我们下面先来看看这个函数,再进行总结。event_base_loopint event_base_loop(struct event_base *base, int flags) { const stru

Move_now的博客 1344

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

主循环-wp主题开发

wp主题开发的时候,如何调用循环的列表,如,文章列表,图片列表,搜索结果列表等等,都需要用主循环进行调用 主循环代码: 方法一: <?php if(...

QUX轻博客 212

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

游戏主循环(Game Loop)详解

每一个复杂的应用程序的核心都是一个循环(Loop) - 贯穿于一个应用程序生活周期的是一部分代码不断的重复执行时间.这个循环(Loop),可以就说是主循环。主循环的主要作用是:协调程序的行为(事件)和建里应用程序的中枢。   游戏主循环(Game Loop):游戏(Game)的开发也不例外,也是有主循环(Game Loop)的,游戏主循环(Game Loop)是每个游戏中最重要的一部分。游戏都...

weixin_34107739的博客 626

游戏架构其六:游戏主循环

绚丽的大型游戏背后,都存在着一个主循环,能根据游戏的进度控制游戏的状态。主循环管理游戏的正常运行,管理着游戏运行失败该如何处理,对某些不能运行的情况给予杀死等等。另外,在MMORPG中,主循环同样也是AI的管理者,时刻根据游戏的运行状态,调度出不同的AI运行,增强了游戏的可玩性和趣味性。同时主循环对于关卡控制,游戏画面渲染,声音管理,资源管理也有所掌控。总之,主循环对于大型游戏是不可或缺的一部分~

Blary的专栏 2165

主事件循环

主循环一般如此写: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 首先在这个主循环之间,main函数已经对当前窗口

四夕日 月 1566

51单片机 主循环和中断共享全局变量的问题

去年写的文章自己也看不懂了,很粗糙,今天重新整理下。 现象:工作中遇到一个大坑,STC11F32设置的运行灯闪烁周期为500ms,大多数是500ms低电平和500ms高电平,但偶尔运行灯会有很快熄灭或很快点亮的情况,肉眼观察到运行灯闪烁不均匀,用示波器观察时发现:有40ms左右的高电平或低电平出现,对,就这么简单的一个程序,奇哉怪哉! 函数中定义的变量为16位,如果定义为l...

breeze的专栏 5586

网络游戏中的主循环

引言: 网络游戏作为一种复杂度较高的软件,从其设计角度还是有一些共性的,比方说几乎所有的网游都会有一个主循环。由于游戏需要根据输入、游戏内状态的改变来不间断地更新游戏画面,所以游戏的主循环往往看起来像一个“死循环”,那么这个“死循环”是如何工作的?

coffeecato的个人博客 3023

使用EvnetBus进行消息传递解析

上一篇介绍了EventBus是如何进行数据传递的,这一篇介绍一下我们在工作中是如何用EvnetBus进行消息传递的EventBus的注册还销毁就不必说了,直接上代码,要传递消息跟传递数据一样,就是要告诉你我要干什么动作,不必传递数据,道理其实是一样的,这里为了怕大家不太理解,就赘述一下建立消息传递事件 /** * 点击事件事件 */ public class ClickEvent { p

隔壁小王的博客 1545

spring event的事件驱动模型的最佳实践@EventListener

我们知道观察者模式可以实现代码的解耦,而spring的event模型就是这种设计模式的极佳体现。一个事件包含:事件发布、监听、和事件源。在spring中我们可以通过ApplicationContext的publishEvent方法去发布事件;通过实现实现ApplicationListener接口来自定义自己的监听器;继承ApplicationEvent类来实现事件源。下面以一个实例来说明: ...

学习 1万+

node evnet 参数

//如何告诉事件一些基础信息,事件触发如何传递参数呢 const EventEmitter=require('events'); class CustomEvent extends EventEmitter{} const ce=new CustomEvent(); //此处介绍一个通用的事件处理函数,当程序出现错误的时候,我们怎么通知事件处理程序呢,通用的一个error事件,第一个参数告...

王依米 244

EventBus使用详解(一)——初步使用EventBus

前言:EventBus是上周项目中用到的,网上的文章大都一样,或者过时,有用的没几篇,经过琢磨,请教他人,也终于弄清楚点眉目,记录下来分享给大家。 相关文章: 1、《EventBus使用详解(一)——初步使用EventBus》 2、《EventBus使用详解(二)——EventBus使用进阶》 一、概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功...

启舰 43万+

vue中$event理解和框架中在包含默认值外传参

在vue中普通方法中默认带有event DOM事件如greet方法,如果是内联函数的话如warn方法,只需要在定义方法的地方同时传入**event∗∗即可,这里需要强调的是在iview中,这里用的是select组件,在其‘on−change‘事件中如果想要传入自定义的参数,使用直接传参的方式,获取的是传入的参数,那么如何获取到该方法默认的返回值(即不传参数时返回的默认选中值),这里使用∗∗e...

山海一哥的博客 2万+
上一篇: event 注册和注销
下一篇: event 非正常退出主循环
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值