news 2026/10/16 4:18:19

易语言系统处理运行()命令详解:消息队列、调用频率与界面保活实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
易语言系统处理运行()命令详解:消息队列、调用频率与界面保活实践

1. 从“系统处理运行()”这个命令名说起

第一次看到“系统处理运行()”这个命令名,很多人会以为它是个万能入口,点一下就能让整个程序跑起来。实际上在易语言的语境里,这个命令属于系统核心支持库中最底层的一类,它不负责业务逻辑,也不负责界面渲染,它干的事情非常单一:把当前进程的控制权交还给操作系统,让系统去处理那些已经排队的消息和事件。

我最早接触这个命令是在做一个批量文件处理工具的时候。当时程序界面上有个进度条,循环里每处理完一个文件就更新一次进度,结果跑起来界面直接卡死,进度条一动不动,直到全部处理完才“唰”地一下跳到100%。后来翻易语言的帮助文档,才注意到“系统处理运行()”这个命令,把它塞进循环里,界面立刻就活了。这个经历让我意识到,这个命令的价值不在于“处理”,而在于“让出”。

它的典型使用场景其实就三类:长循环中保持界面响应、等待某个外部操作完成时避免假死、在密集计算中给系统消息处理留出时间片。如果你写的程序是那种“点一下按钮,然后等几秒出结果”的类型,那这个命令可能一辈子都用不上;但只要你涉及到循环、等待、轮询,它就几乎是绕不开的一环。

这篇文章我会从它的底层机制讲起,把参数、返回值、调用时机、常见误用、性能影响、替代方案全部拆开说清楚。不管你是刚接触易语言的新手,还是已经写过几万行代码的老手,只要你的程序里出现过“界面卡住”的问题,这里的内容应该都能直接派上用场。

2. 系统处理运行()到底在系统层面做了什么

2.1 消息队列与消息泵的基本概念

要理解这个命令,得先知道Windows程序是怎么“活”起来的。每个带界面的程序都有一个消息队列,操作系统会把用户的点击、键盘输入、窗口重绘、定时器到期等事件统统塞进这个队列里。程序本身有一个消息循环,通常长这样:从队列里取一条消息,翻译它,然后分发给对应的窗口处理函数。

易语言把这一套东西封装起来了,你写界面的时候不需要手动写消息循环,运行库已经帮你做好了。但问题在于:这个消息循环只在你的代码不占用CPU的时候才有机会跑。如果你写了一个循环,里面在做大量计算,那消息循环就被“饿死”了,队列里的消息越堆越多,界面自然就卡住不动。

“系统处理运行()”的作用,就是在你的代码主动调用它的时候,临时接管一下消息队列,把里面积压的消息取出来处理掉,处理完再回到你的代码继续往下走。你可以把它理解成:你在埋头干活的时候,偶尔抬头看一眼门口有没有人找你,有的话先处理一下,然后再继续干活。

2.2 它和“延时()”的本质区别

很多人会把“系统处理运行()”和“延时()”搞混,觉得都是让程序“停一下”。但两者的机制完全不同。

“延时()”是真的让当前线程睡过去,在指定的毫秒数内,这个线程不占用CPU,也不处理任何消息。如果你在循环里用“延时(100)”来试图让界面响应,你会发现界面确实不卡了,但响应速度变得极慢,因为每处理一次就要睡100毫秒,用户点个按钮要等半天才有反应。

“系统处理运行()”则不会主动休眠,它只是把CPU时间片的一部分用来处理消息,处理完立刻返回。它的开销比“延时()”小得多,而且响应更及时。实测下来,在一个每秒执行上万次的循环里插入这个命令,界面依然能保持流畅,而CPU占用率只会上升几个百分点。

注意:如果你的循环体本身执行一次就要几百毫秒,那光靠“系统处理运行()”是救不回来的。消息处理的前提是“有机会被调用”,如果两次调用之间隔了太久,用户还是会觉得卡。这种情况下需要把大任务拆成小片,或者用线程来处理。

2.3 返回值与调用开销的实测数据

这个命令的返回值通常是一个逻辑值,表示本次处理是否成功。但在实际使用中,几乎没有人会去检查返回值,因为它在正常环境下不会失败。真正值得关注的是它的调用开销。

我做过一组简单的测试:在一个空循环里分别插入不同频率的“系统处理运行()”,然后观察循环耗时和界面响应情况。测试环境是一台普通的办公电脑,循环次数固定为一千万次。

调用频率总耗时(毫秒)界面响应CPU占用
不调用320完全卡死25%
每1000次调用380流畅27%
每100次调用520流畅31%
每10次调用1800流畅45%
每次调用9500流畅68%

从数据可以看出,每1000次调用一次是一个比较平衡的点,开销只增加了不到20%,但界面已经完全不卡了。每10次调用一次就开始有明显的性能损失,每次调用则几乎让循环慢了30倍。所以我的经验是:除非你的单次循环体执行时间特别长(比如超过10毫秒),否则没必要调用得太频繁。

3. 在哪些场景下必须用它,哪些场景下用了反而添乱

3.1 长循环中的界面保活

这是最经典的用法。比如你要遍历一个目录下的几万个文件,每处理一个就更新一下进度条。如果不加“系统处理运行()”,进度条会在循环结束后才刷新,用户看到的就是一个假死的窗口。

正确的写法是在循环体内加一个计数器,每处理N个文件调用一次。N的取值取决于单次处理的耗时:如果单次处理只要几毫秒,N可以取500到1000;如果单次处理要几十毫秒,N取10到50就够了。

.版本 2 .局部变量 计数器, 整数型 .局部变量 文件列表, 文本型, , "0" .局部变量 i, 整数型 文件列表 = 取目录文件列表 (“C:\测试目录”) .计次循环首 (取数组成员数 (文件列表), i) 处理单个文件 (文件列表 [i]) 计数器 = 计数器 + 1 .如果真 (计数器 % 500 = 0) 系统处理运行 () 更新进度条 (i, 取数组成员数 (文件列表)) .如果真结束 .计次循环尾 ()

这里有个细节:更新进度条的操作最好放在“系统处理运行()”之后。因为进度条刷新本身也是一个窗口消息,先让系统处理完积压的消息,再发出新的重绘请求,这样界面更新的节奏会更均匀。

3.2 等待外部程序返回时的假死避免

有时候你需要调用一个外部程序,然后等它执行完。易语言里可以用“运行()”加“等待进程结束()”,但“等待进程结束()”是阻塞的,在等待期间界面完全没反应。这时候可以在等待循环里插入“系统处理运行()”。

.版本 2 .局部变量 进程句柄, 整数型 进程句柄 = 运行 (“C:\工具\处理器.exe”, 假, ) .判断循环首 (进程_是否运行 (进程句柄)) 系统处理运行 () 延时 (50) .判断循环尾 ()

注意这里我同时用了“延时(50)”。因为“系统处理运行()”本身不会休眠,如果外部程序要跑好几秒,这个循环会疯狂空转,把CPU吃满。加一个短延时可以让CPU喘口气,同时50毫秒的间隔对界面响应来说也完全够用。

3.3 什么时候不该用它

有三种情况我建议你不要用这个命令:

第一种是单次循环体极短、循环次数极少的场景。比如一个只跑几十次的循环,每次就做个简单加法,那卡不卡用户根本感知不到,加了反而增加无谓的开销。

第二种是在线程里。易语言的线程本身有自己的消息处理机制,在线程里调用“系统处理运行()”可能会导致消息被错误地分发到主线程的窗口上,引发一些莫名其妙的界面错乱。如果在线程里需要让出CPU,用“延时()”更安全。

第三种是在窗口的“创建完毕”事件里。这个事件触发的时候,窗口还没完全初始化好,这时候处理消息队列可能会遇到一些未定义的行为。我遇到过在“创建完毕”里调用它导致窗口闪烁的情况,后来挪到“首次激活”事件里就正常了。

4. 参数、返回值与调用时机的细节拆解

4.1 命令签名的完整解读

在易语言的系统核心支持库里,“系统处理运行()”的签名非常简单,它不接受任何参数,返回一个逻辑值。这个逻辑值在绝大多数情况下都是“真”,只有在消息队列出现异常时才会返回“假”。

虽然没有参数,但它的行为会受到调用上下文的影响。具体来说:

  • 如果当前窗口是模态窗口(比如用“载入()”加“真”参数打开的对话框),那消息处理的范围会被限制在这个模态窗口内,主窗口的消息不会被处理。
  • 如果当前有菜单弹出或者有拖动操作正在进行,消息处理会优先处理这些高优先级的输入。
  • 如果当前线程不是GUI线程,调用这个命令的效果会大打折扣,甚至完全无效。

这些细节在官方文档里基本没提,但实际用起来差别很大。我踩过一次坑:在一个模态对话框的循环里调用“系统处理运行()”,结果主窗口的关闭按钮点不动,用户以为程序死了。后来改成用非模态方式打开对话框,问题就消失了。

4.2 调用频率的量化计算方法

前面我给了几个经验值,但更科学的做法是根据单次循环体的执行时间来动态决定调用频率。思路是这样的:

假设你希望界面在最多100毫秒内能响应一次用户操作,而单次循环体执行时间是T毫秒,那么调用间隔N应该满足:N × T ≤ 100。也就是说,N = 100 / T。

比如单次处理一个文件需要0.5毫秒,那N可以取200;如果单次处理需要5毫秒,那N只能取20。这个公式在大多数情况下都适用,唯一需要注意的是T的测量要准确,最好在真实数据上跑几轮取平均值。

.版本 2 .局部变量 起始时间, 整数型 .局部变量 单次耗时, 双精度小数型 .局部变量 调用间隔, 整数型 起始时间 = 取启动时间 () 处理单个文件 (“测试文件”) 单次耗时 = 取启动时间 () - 起始时间 .如果真 (单次耗时 < 1) 单次耗时 = 1 .如果真结束 调用间隔 = 到整数 (100 ÷ 单次耗时) .如果真 (调用间隔 < 1) 调用间隔 = 1 .如果真结束

这段代码可以在程序启动时先跑一次基准测试,然后根据结果自动设置调用间隔。虽然多写了几行,但比硬编码一个固定值要靠谱得多。

4.3 返回值被忽略的潜在风险

虽然返回值几乎总是“真”,但在一种情况下它会返回“假”:当前线程的消息队列已经被销毁或者不可用。这种情况通常发生在窗口已经关闭但循环还在跑的时候。

如果你在窗口的“将被销毁”事件里启动了一个长循环,而循环里又调用了“系统处理运行()”,那当窗口真正销毁后,这个命令就会开始返回“假”。如果你不检查返回值,循环会继续跑下去,但界面已经没了,用户只能通过任务管理器强制结束进程。

所以我的建议是:在长循环里检查返回值,如果返回“假”就主动跳出循环。这样至少能保证程序不会变成一个无法关闭的僵尸进程。

.版本 2 .局部变量 继续运行, 逻辑型 继续运行 = 真 .判断循环首 (继续运行) ' 业务处理代码 .如果真 (系统处理运行 () = 假) 继续运行 = 假 .如果真结束 .判断循环尾 ()

5. 和其他消息处理方案的对比与选型

5.1 与“处理事件()”的异同

易语言里还有一个命令叫“处理事件()”,功能上和“系统处理运行()”非常接近,很多人分不清该用哪个。我查过一些资料,也做过对比测试,两者的核心区别在于处理范围。

“处理事件()”主要处理的是当前窗口的输入事件,比如鼠标点击、键盘按键这些。而“系统处理运行()”处理的范围更广,包括窗口重绘、定时器、系统广播等所有排队中的消息。

在实际使用中,如果你的循环只需要保证按钮能点、窗口能拖动,那“处理事件()”就够了,而且开销更小。但如果你还需要进度条刷新、窗口重绘、定时器触发,那就必须用“系统处理运行()”。

我个人的习惯是:不确定的时候就用“系统处理运行()”,因为它的兼容性更好,不容易出现“按钮能点但界面不刷新”这种半死不活的状态。

5.2 与多线程方案的取舍

从根本上说,界面卡死是因为主线程被占用了。解决这个问题最彻底的办法是把耗时操作放到线程里,主线程只管界面刷新。易语言支持多线程,用“启动线程()”就可以。

但多线程也有它的代价:线程间的数据同步很麻烦,尤其是涉及到界面控件的时候,子线程不能直接操作窗口组件,必须通过消息或者共享变量来通信。对于简单的批量处理任务,用“系统处理运行()”在单线程里解决反而更省事。

我的选型原则是这样的:

场景推荐方案理由
循环次数少于1万,单次耗时短系统处理运行()改动最小,风险最低
循环次数超过10万,或单次耗时长多线程单线程再怎么优化也会卡
需要同时处理多个独立任务多线程单线程无法并行
任务之间有严格的先后依赖系统处理运行()多线程同步成本太高
需要频繁更新复杂界面多线程+消息通知主线程只负责渲染

5.3 性能敏感场景下的替代思路

如果你的程序对性能极其敏感,连“系统处理运行()”那点开销都不想承担,那可以考虑分段处理的思路:把一个大循环拆成多个小循环,每个小循环结束后主动返回,让消息循环有机会跑一轮。

具体做法是用一个定时器,每隔几十毫秒触发一次,每次处理一批数据。这样完全不需要在循环里调用任何消息处理命令,界面响应也是天然的。缺点是代码结构会变得复杂一些,需要把循环状态保存下来,下次触发时接着跑。

.版本 2 .局部变量 当前索引, 整数型 .局部变量 总数量, 整数型 .子程序 _时钟1_周期事件 .局部变量 本批结束, 整数型 本批结束 = 当前索引 + 100 .如果真 (本批结束 > 总数量) 本批结束 = 总数量 .如果真结束 .计次循环首 (本批结束 - 当前索引, ) 当前索引 = 当前索引 + 1 处理单个文件 (文件列表 [当前索引]) .计次循环尾 () .如果真 (当前索引 ≥ 总数量) 时钟1.时钟周期 = 0 提示框 (“处理完成”) .如果真结束

这种写法在游戏开发和高频交易系统里很常见,核心思想就是永远不阻塞消息循环。虽然代码量比直接循环多了不少,但性能上限是最高的。

6. 那些年我踩过的坑和排查过程

6.1 调用后界面反而更卡了

有一次我写了一个图片批量压缩工具,在循环里每处理一张图就调用一次“系统处理运行()”。按理说界面应该很流畅,但实际跑起来比不加还卡,鼠标移动都有拖影。

排查过程是这样的:我先用“取启动时间()”测量了单次循环的耗时,发现处理一张图平均要80毫秒。这意味着每80毫秒才调用一次消息处理,而消息队列在这80毫秒里可能已经积压了几十条重绘消息。当“系统处理运行()”被调用时,它要一次性处理这么多消息,反而造成了更长的卡顿。

解决方案是把调用频率提高,改成每处理一张图调用两次:一次在压缩开始前,一次在压缩结束后。这样消息处理的间隔缩短到了40毫秒左右,界面就恢复正常了。这个案例告诉我:调用频率不是越低越好,关键是要和单次任务的耗时匹配。

6.2 模态窗口下的消息死锁

前面提到过模态窗口的问题,这里展开说一下排查过程。当时的情况是:主窗口有个按钮,点击后打开一个模态对话框,对话框里有个循环在跑。循环里调用了“系统处理运行()”,但主窗口的关闭按钮完全没反应。

我一开始以为是消息处理没生效,后来用调试工具查看消息队列,发现主窗口的关闭消息确实被放进了队列,但一直没有被分发。原因是模态对话框的消息循环只处理属于对话框的消息,主窗口的消息被过滤掉了。

解决办法有两个:要么把对话框改成非模态,要么在循环里用“处理事件()”代替“系统处理运行()”,因为“处理事件()”的处理范围更窄,不会触发模态过滤。我选了后者,改动最小,效果也够用。

6.3 循环退出后的残留消息

还有一个比较隐蔽的坑:在循环里频繁调用“系统处理运行()”之后,如果循环因为某个条件提前退出,消息队列里可能还残留着一些未处理的消息。这些消息会在循环结束后的某个时刻被处理,导致一些意料之外的界面行为。

我遇到的具体表现是:循环结束后,窗口突然闪烁了几下,然后弹出了一个本不该出现的提示框。排查后发现是循环期间用户点击了某个按钮,这个消息被排在了队列里,循环退出后才被处理。

解决办法是在循环退出后,再调用一次“系统处理运行()”,把残留的消息清干净。如果某些消息不应该被处理,可以在循环期间临时禁用相关控件,等循环结束后再恢复。

.版本 2 ' 循环开始前 按钮1.禁止 = 真 按钮2.禁止 = 真 ' 循环体 .计次循环首 (10000, i) ' 业务处理 .如果真 (i % 500 = 0) 系统处理运行 () .如果真结束 .计次循环尾 () ' 循环结束后清理残留消息 系统处理运行 () ' 恢复控件 按钮1.禁止 = 假 按钮2.禁止 = 假

7. 进阶用法:把消息处理嵌入到自己的框架里

7.1 封装一个带频率控制的处理类

如果你在多个项目里都要用到这个命令,可以考虑把它封装成一个类,把频率控制、返回值检查、残留清理这些逻辑都包进去。这样调用方只需要在循环里写一行代码,不用关心细节。

.版本 2 .类 消息处理器 .成员 计数器, 整数型 .成员 调用间隔, 整数型 .成员 已销毁, 逻辑型 .子程序 初始化, , 公开 .参数 间隔, 整数型, 可空 .如果真 (是否为空 (间隔)) 间隔 = 500 .如果真结束 调用间隔 = 间隔 计数器 = 0 已销毁 = 假 .子程序 处理, 逻辑型, 公开 计数器 = 计数器 + 1 .如果真 (计数器 % 调用间隔 ≠ 0) 返回 (真) .如果真结束 .如果真 (已销毁) 返回 (假) .如果真结束 .如果真 (系统处理运行 () = 假) 已销毁 = 真 返回 (假) .如果真结束 返回 (真) .子程序 清理, , 公开 系统处理运行 () 计数器 = 0

用的时候就这样写:

.版本 2 .局部变量 处理器, 消息处理器 处理器.初始化 (500) .计次循环首 (100000, i) ' 业务处理 .如果真 (处理器.处理 () = 假) 跳出循环 () .如果真结束 .计次循环尾 () 处理器.清理 ()

这样封装之后,代码的可读性和可维护性都会好很多,而且频率控制、异常处理这些逻辑都集中在一处,改起来也方便。

7.2 根据系统负载动态调整频率

更进一步,你可以根据当前的CPU占用率或者消息队列长度来动态调整调用间隔。比如系统空闲的时候就少调用几次,系统繁忙的时候就多调用几次。易语言里可以用“取CPU占用率()”来获取当前负载,然后映射到一个合适的间隔值。

这个思路在长时间运行的后台工具里特别有用。我做过一个文件监控工具,平时CPU占用很低,调用间隔设成2000都没问题;但当有大量文件同时变化时,CPU会飙升,这时候就需要把间隔降到100左右,否则界面会明显卡顿。

7.3 与定时器方案的混合使用

最后分享一个混合方案:在主循环里用“系统处理运行()”保证基本响应,同时用一个低频定时器(比如每500毫秒触发一次)来更新那些不需要实时刷新的界面元素。这样可以把消息处理的压力分散开,主循环里的调用频率可以设得更低,整体性能更好。

这个方案的关键是区分哪些界面元素需要实时更新,哪些可以延迟更新。进度条、状态文字这些需要实时反馈的,放在主循环里更新;日志列表、统计图表这些可以稍慢一点的,放在定时器里更新。分清楚之后,整个程序的响应性和流畅度都会有明显提升。

8. 一些零散但实用的经验补充

关于这个命令,还有一些零零碎碎的经验,不太适合单独成章,但都挺实用,我列在下面:

第一,不要在“系统处理运行()”前后做耗时操作。这个命令本身很快,但如果你在它前面写了一个复杂的计算,那消息处理的时机就会被推迟。正确的做法是把耗时操作放在两次调用之间,而不是紧挨着调用。

第二,注意窗口的“允许重绘”属性。有些控件在循环期间频繁重绘会拖慢整体速度。可以在循环开始前把相关控件的“重绘”属性设为假,循环结束后再恢复。这样即使调用了“系统处理运行()”,也不会触发不必要的重绘。

第三,调试模式下这个命令的行为可能和编译后不一样。易语言的调试器本身会拦截一些消息,导致“系统处理运行()”的效果打折扣。如果你在调试时发现界面响应不正常,先编译成EXE再测一遍,很多时候问题就消失了。

第四,在Windows服务或者无界面程序里,这个命令基本没用。因为它依赖消息队列,而没有窗口的程序消息队列是空的,调用它等于空转。这种情况下应该用“延时()”来让出CPU。

第五,如果你用了皮肤或者界面库,消息处理可能会被拦截。某些第三方界面库会自己接管消息循环,这时候“系统处理运行()”可能不会按预期工作。遇到这种情况,需要查界面库的文档,看它有没有提供自己的消息处理接口。

第六,循环里如果有“处理事件()”和“系统处理运行()”同时存在,注意调用顺序。一般来说先调用“处理事件()”处理输入,再调用“系统处理运行()”处理重绘,这样用户的点击能得到最快响应。

第七,记得在循环结束后恢复所有被临时修改的控件属性。我见过太多因为循环中途出错退出,导致按钮一直处于禁用状态的案例。用“如果真”加“跳出循环”的时候,一定要确保恢复代码在跳出后也能执行。

这些经验大部分都是我在实际项目里踩坑之后总结出来的,官方文档里基本不会提。易语言这个生态就是这样,很多细节要靠自己摸索,但一旦摸清楚了,写出来的程序稳定性和用户体验都会上一个台阶。

“系统处理运行()”这个命令看起来简单,但要用好并不容易。它不是一个“加了就万事大吉”的银弹,而是一个需要根据具体场景调整策略的工具。频率太高浪费性能,频率太低界面卡顿,调用时机不对还会引发各种奇怪的问题。我的建议是:先理解它的机制,然后在自己的实际场景里做几组对比测试,找到最适合的调用间隔。这个测试花不了多少时间,但能帮你省下大量后期调试的精力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 4:17:56

告别print:Python可观测性之结构化日志与链路追踪

我印象很深的一次排障,是某订单系统上线之后偶发页面加载卡顿。当时几个同事的第一反应就是加日志,但惯用print的同事直接在业务代码里打了十几行中间的变量,跑到终端一看,刷屏倒是快,可一关窗口什么都没有&#xff0c…

作者头像 李华
网站建设 2026/10/16 4:17:03

数据挖掘期末备考宝典:核心考点与手算流程全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 4:16:43

Claude Code Mods:可编程工作流与输入输出双控实践

1. 从“代码补全工具”到“可编程工作流”:Claude Code Mods 的本质跃迁很多人第一次听说 Claude Code 中的 Mods,下意识会把它当成一个“高级插件”或者“主题皮肤”——就像给编辑器换个配色、加个快捷键映射那样。我最初也这么想,直到在某…

作者头像 李华
网站建设 2026/10/16 4:16:15

Repast多智能体仿真完整教程:从环境搭建到参数扫描与结果导出

简介:这份资源是面向多Agent系统建模与仿真学习者的Repast完整教程与实例合集,适合社会科学、经济学及复杂系统方向的研究者、学生和工程师,用于从零掌握Repast的安装配置、模型构建与运行分析。压缩包共72个文件,约303KB&#xf…

作者头像 李华
网站建设 2026/10/16 4:14:11

C++轻量XML解析实战:TinyXML2集成、读写与避坑指南

简介:这是一份面向C开发者的TinyXML库集成与使用入门资料,定位于轻量级XML解析场景,适合需要处理配置文件、结构化数据存储或网络数据交换的初学者,也适合想快速理解XML DOM解析原理的读者。资源共30个文件,压缩包7.27…

作者头像 李华
网站建设 2026/10/16 4:13:46

Webots仿真案例包跑通指南:版本对齐、控制器与传感器避坑

简介:一整套面向机器人学习者和开发者的Webots仿真案例合集,覆盖机器人运动控制与智能行为两大方向,案例包括弹簧腿跳跃与行走的动力学分析、倒立摆的平衡控制、四足狗的多种步态规划、基于键盘控制的小车避障,以及视觉巡线等内容…

作者头像 李华