易语言乐玩插件多线程索引方案:告别串线崩溃,稳定并发找图
1. 方法3要解决的核心麻烦写易语言的乐玩插件多线程模块很多人一开始都会觉得“启动线程不就行了”可真正把找图、找色、OCR这些操作丢进多线程之后问题就全冒出来了。最典型的就是“串线”——明明开5个线程处理5个不同任务结果线程A的图找在了线程B的窗口上或者线程C居然拿到了线程D创建的对象句柄一顿操作下来整个程序要么崩溃、要么结果全乱。我整理的这套“511遇见易语言乐玩插件多线程模块索引–方法3”笔记核心思路就是用一个索引表把事情理顺。方法3听起来玄乎拆开看就是三个动作给每个线程编一个固定编号把乐玩插件对象、线程句柄、任务状态全部登记到这个编号下面线程启动之后只认自己的编号不碰别的线程的东西。这样多个线程同时跑各用各的索引槽位互不干扰稳定性立刻上一个台阶。这套方案适合谁主要就是已经在用易语言写乐玩脚本想在找图、找色、文字识别这些场景里加入多线程但被崩溃、串号、对象失效问题折磨过的人。哪怕你是刚接触多线程的新手只要照着索引的思路把数据结构建好后面写并发任务会顺手很多。这期内容我不讲虚的直接拆索引结构、给代码流程、讲我踩过的坑照着改就能用到自己的项目里。2. 索引模块的整体设计思路2.1 为什么不用裸传对象句柄的方式先从最朴素的多线程写法说起。很多人启动线程时会直接“启动线程任务函数参数”然后在参数里塞一个乐玩对象句柄或者窗口句柄进去。这写法的优点是简单缺点却很致命乐乐插件属于COM组件COM对象在哪个线程创建原则上就应该在哪个线程里调用。你非要把主线程创建出来的对象句柄丢到其他线程里很多时候一调用就崩溃或者返回空值几乎没有商量余地。退一步讲就算你运气好没崩一旦线程多了代码里到处是对象句柄传来传去排错的时候根本分不清哪个对象是谁创建的、哪个句柄对应哪个窗口状态完全不可控。我印象特别深的是有一次写批量识别任务把同一个对象句柄传给了三个线程结果三个线程同时调取图片数据返回的结果全是乱的排查了半天才发现是共享对象导致的冲突。方法3的索引方案就是针对这个问题来的。它不再传对象句柄而是传一个整数编号。对象让线程自己创建、自己持有别的线程碰不到从根上断绝了跨线程调用COM组件的风险。索引模块做的事情就是管理好这个编号和各个对象之间的对应关系让每个线程在任何时刻都能快速定位到自己的那套资源。2.2 索引表应该存哪些字段用索引方案第一步就是设计好索引表里放什么。我当时做了一套三个数组的方案跑了很久都没出过结构性问题你可以直接参考。最基础的三样东西分别是线程句柄索引、乐玩对象索引和任务状态索引。线程句柄索引用来记录当前槽位被哪个线程占用后续要停止线程、等待线程退出直接根据索引找到句柄就行乐玩对象索引存的是当前线程自己创建的乐玩对象标识线程执行找图找色时从这个索引取出自己的对象来用任务状态索引标记槽位是空闲、忙碌、还是等待回收申请槽位、释放槽位都靠它来判断。除了这三个核心数组最好再加一个任务ID索引和一个结果索引。任务ID用来识别这一轮线程在做哪个任务结果索引存返回状态成功、失败、超时。这样索引表就是一个完整的任务登记册任何一个线程跑完主线程都能按编号查到这个线程干了什么、结果如何。提示数组容量要预留够而且必须在程序启动时就初始化好。我一般会一次性申请足够大的容量同时记录一个当前已用上限而不是动态扩容。动态数组在并发环境下扩容很危险多线程同时写数组一次扩容就可能重排内存直接导致访问越界。2.3 三个方法横向对比为什么是方法3既然叫“方法3”说明系列里至少还有其他两种写法我自己整理过一张对比表基本把易语言乐玩多线程常见方案的差异都讲透了。方案对象来源线程间隔离性崩溃风险适用场景方法1全局单对象多线程共用主线程创建全局共用极差极高只适合低并发演示方法2线程内创建对象参数直接传句柄线程内创建但句柄仍被跨线程传递一般高线程数量少、逻辑简单方法3索引表按槽位分配对象与线程线程内创建句柄只归属本槽位好低并发任务多、要求稳妥方法1最大的问题是所有线程抢同一个乐玩对象两个线程同时执行找图命令另外一个线程就可能得到一个错误结果。方法2虽然让每个线程创建了自己的对象但句柄传参和释放时机都很容易搞错。方法3等于把方法2的“每个线程自己创建对象”保留下来再引入索引表做隔离每个线程只访问自己槽位的句柄不再出现跨线程传句柄的操作整体容错能力就完全不一样了。我在实际项目里从方法2迁到方法3之后原来一天崩十几次的批量任务跑一整晚都没再出过事。这也是我把方法3单独拿出来写一篇的原因它的收益不是代码变少了而是稳定性提升非常明显。3. 从零搭建带索引的多线程模块3.1 全局索引表和初始化子程序这一节直接给代码框架。用易语言实现索引方案核心是先定义全局数组和几个辅助子程序下面这段是示意代码重点是结构和调用关系。.版本 2 .程序集 窗口程序集_启动窗口 .全局变量 全局_线程句柄索引, 整数型, , 256 .全局变量 全局_乐玩对象索引, 整数型, , 256 .全局变量 全局_任务状态索引, 整数型, , 256 .全局变量 全局_任务ID索引, 整数型, , 256 .全局变量 全局_结果索引, 整数型, , 256 .全局变量 全局_索引锁, 整数型 .全局变量 全局_已经初始化的槽位数量, 整数型初始化的时候要做几件事把索引锁创建好把所有任务状态索引置成“空闲”把乐玩对象索引全部清成0。有一点容易被忽略——索引锁创建的时机必须在任何线程启动之前否则两个线程同时申请空闲槽位就会同时改同一条数组记录产生竞争条件。.子程序 初始化索引模块 .局部变量 循环变量, 整数型 全局_索引锁 创建临界区 () 计次循环首 (256, 循环变量) 全局_任务状态索引 [循环变量] 0 0空闲 1忙碌 2待回收 全局_乐玩对象索引 [循环变量] 0 全局_已经初始化的槽位数量 0这里我把任务状态分成三类判断槽位能不能用就看状态是不是0。空闲状态表示这个索引位没有任何任务占用可以放心分配。之所以加一个“待回收”状态是为了防止任务函数还没彻底退出主线程就急着把索引拿出去复用结果两个线程在同一个槽位上打架。这个细节看起来小实际运行起来救过我好几次。3.2 申请一个空闲槽位并创建线程申请槽位是所有并发任务的第一步。这个子程序只做一件事找一个状态为“空闲”的索引位置把它标志成“忙碌”。搜索过程必须在临界区保护下进行否则两个线程同时调用申请槽位可能拿到同一个编号。.子程序 申请空闲槽位, 整数型 .局部变量 循环变量, 整数型 .局部变量 找到的槽位, 整数型 找到的槽位 0 进入临界区 (全局_索引锁) 计次循环首 (256, 循环变量) 如果真 (全局_任务状态索引 [循环变量] 0) 全局_任务状态索引 [循环变量] 1 找到的槽位 循环变量 全局_已经初始化的槽位数量 全局_已经初始化的槽位数量 1 跳出循环 () 如果真结束 计次循环尾 () 退出临界区 (全局_索引锁) 返回 (找到的槽位)拿到槽位之后就在这个槽位上创建乐玩对象。不要小看这一步的先后顺序——必须先建好对象再启动线程不能让线程先跑起来然后去等对象创建。线程一旦启动执行速度很快如果对象还没挂上索引线程就已经开始取对象了那就会取到一个空值。乐玩对象的创建方式根据你的插件版本略有不同有的是“初始化COM接口”有的是“打开插件”但原则是一致的这个对象创建后把它的句柄写入全局_乐玩对象索引[槽位]。然后启动线程时把槽位号作为参数传进去。.子程序 创建索引线程, 整数型, 参数 任务类型, 整数型, 参数 任务参数文本, 文本型 .局部变量 槽位号, 整数型 .局部变量 线程句柄, 整数型 槽位号 申请空闲槽位 () 如果真 (槽位号 0) 返回 (0) 索引表满了 如果真结束 全局_乐玩对象索引 [槽位号] 创建乐玩对象 () 全局_任务ID索引 [槽位号] 任务类型 线程句柄 启动线程 (槽位号, 任务参数文本) 全局_线程句柄索引 [槽位号] 线程句柄 返回 (槽位号)这里注意一个细节启动线程后马上把线程句柄存进索引但这个句柄只是留着后面查询和等待用的线程内部的执行逻辑不依赖这个句柄。不要把“线程句柄”和“线程内使用的乐玩对象”搞混它们住在索引表的不同列里各司其职。3.3 线程函数内部按索引取对象执行线程函数是整个模块的执行核心。它接收一个整数参数也就是槽位号然后做四件事根据槽位号取出乐玩对象调用乐玩命令执行任务把运行结果写入结果索引最后把槽位状态改成待回收。.子程序 线程任务函数 .参数 槽位号, 整数型 .局部变量 当前对象, 整数型 .局部变量 找图结果, 整数型 当前对象 全局_乐玩对象索引 [槽位号] 如果真 (当前对象 0) 全局_结果索引 [槽位号] -1 对象无效 释放索引槽位 (槽位号) 返回 () 如果真结束 找图结果 乐玩_找图 (当前对象, 参数_图片路径, 参数_相似度) 全局_结果索引 [槽位号] 找图结果 释放索引槽位 (槽位号)这个流程的关键在于当前对象是线程自己创建、自己持有的整个过程没有任何跨线程传递所以乐玩命令调用时不会因为COM线程模型问题而崩溃。释放索引槽位这一步也很讲究它不是马上把状态改成“空闲”而是改成“待回收”等所有用到这个槽位的代码全部执行完再由主线程统一回收。这里的“统一回收”可以是立即清理也可以由主线程定时清理一遍具体看你的项目节奏。我在实际写代码时还加过一行日志每次线程任务函数启动和结束时输出当前槽位号和任务ID。看起来多余但排查问题时效用极高尤其是并发多个任务的时候日志能快速显示出哪个槽位的线程卡住了哪个任务提前结束了。这个习惯建议保留。3.4 索引槽位的释放与回收释放索引槽位表面上是把状态标成空闲实际上得处理干净否则会出现内存泄漏和任务错乱。一个完整的释放流程应该做以下动作先把线程句柄索引清成0因为线程已经跑完留着旧句柄只会让人误以为线程还在运行。把乐玩对象索引清成0同时释放乐玩对象。这个对象是线程内创建的线程退出前释放掉最安全。把任务ID索引清成0把结果索引清成0。最后把任务状态索引置回“空闲”让这个槽位可以被重新申请。有一点要特别提醒释放乐玩对象时不要试图在别的线程里释放。谁创建、谁释放这是COM组件的基本规矩。如果你在清理子程序里直接全局释放所有对象而那个对象所属的线程还在跑程序跑着跑着就崩了。所以我的做法是线程任务函数的最后一行就是释放自己的对象主线程只负责把状态标志归零。.子程序 释放索引槽位 .参数 槽位号, 整数型 进入临界区 (全局_索引锁) 如果真 (全局_任务状态索引 [槽位号] ≠ 2) 退出临界区 (全局_索引锁) 返回 () 如果真结束 全局_线程句柄索引 [槽位号] 0 全局_乐玩对象索引 [槽位号] 0 全局_任务ID索引 [槽位号] 0 全局_结果索引 [槽位号] 0 全局_任务状态索引 [槽位号] 0 全局_已经初始化的槽位数量 全局_已经初始化的槽位数量 - 1 退出临界区 (全局_索引锁)这套释放逻辑的完整度决定了模块能稳定跑多久。如果只把状态改成空闲就完了下次申请到这个槽位的线程就会拿到上一次残留的乐玩对象句柄用着用着就找错对象了。索引模块的“索引”二字含义就是每一条记录都必须是干净、准确的任何一条脏数据都可能在某个角落引爆问题。4. 我用这个模块踩过的四个坑4.1 跨线程传递乐玩对象导致的秒崩最早写多线程时我图省事在主线程里创建了一个乐玩对象然后用启动线程的第四个参数把对象句柄传进线程。结果程序启动不到两秒就直接闪退连错误提示都没有。后来换成索引方案后我才彻底意识到问题出在“跨线程调用COM组件”上。对象创建在哪个线程就该在哪个线程调用这是原则问题不能图方便。如果你已经用了索引方案但某个线程函数里仍出现“全局_全局对象”这种共享变量赶紧回头检查。正确做法是每个线程任务函数里只使用自己从索引表里取出的当前对象不要碰任何全局面板上的乐玩对象句柄。4.2 索引槽位复用太早导致任务结果错乱这是我遇到过最隐蔽的问题。当初我把释放索引槽位写成直接置“空闲”而线程任务函数在往结果索引里写结果的时候其实还没完全退出。这时候新任务申请到了同一个槽位把任务ID覆盖了旧线程再把结果写进去结果索引里就混了下个任务查到的可能不是自己的结果。解决办法就是我前面说的“待回收”状态。释放动作分两步先在线程里把对象释放、把状态标成“待回收”再由主线程或者下一次循环把槽位彻底归零。这样旧线程和新任务之间就有了缓冲不会互相踩踏。加了这个状态之后我的任务结果错乱率直接降到了0。4.3 临界区范围过大把并发拖成了串行临界区是用来保护索引表读写安全的没错但如果你把乐玩找图命令也放进临界区里问题就来了。我见过一个朋友把整个线程任务函数包进临界区结果5个线程同时执行识别任务每个都排队等锁耗时直接翻了5倍多线程形同虚设。正确做法是临界区只保护索引数组的读写那几行代码。申请槽位时进临界区改完状态马上退出释放槽位时进临界区清完字段马上退出。找图找色、文字识别这些耗时的乐玩操作绝对不能在线程锁里做。记住一个原则锁保护的是索引数据的完整性不是任务的执行。4.4 找图超时导致线程卡死乐玩找图命令如果目标图始终找不到默认可能会持续寻找线程就像卡住了一样结果不返回索引状态一直是“忙碌”这个槽位就废掉了。在多线程环境下更要命的是如果多个槽位都这样模块慢慢就耗尽了可用索引新任务全部申请不到槽位。解决这类问题我做了两件事一是给乐玩命令调用加超时控制外层用定时器检测超过设定的时间就把这个线程的任务标记为“超时失败”另一个是留一个看门狗线程周期性扫描所有忙碌槽位发现某个槽位超时后主动释放或重建线程。这两个机制下来批量任务就算偶发找不到图也能自己恢复不会越积越多卡成一团。5. 常见问题速查与扩展改造5.1 索引模块常见故障速查表下面这张表是我在实际项目调试过程中整理出来的排错时直接对照着查能省掉很多反复测试的时间。现象直接原因解决办法线程启动后立即崩溃跨线程调用了乐玩COM对象改用索引方案线程内创建并调用自己的对象多个任务结果互相串号槽位释放太早索引数据被覆盖加上“待回收”状态分两步释放槽位线程池运行越来越慢找图命令写进了临界区并发变串行临界区只保留索引读写不包业务逻辑任务莫名丢失创建线程前对象还没挂到索引上先创建对象写入索引再启动线程传槽位号索引槽位耗尽超时任务未回收看门狗缺失加看门狗线程超时强制回收槽位偶数次运行后结果不稳定上一轮线程句柄没有清理释放索引时清空所有字段不留旧数据这里再分享一个排查技巧当你发现程序行为奇怪先用日志把每个槽位的状态打出来看看哪些槽位是空闲、哪些忙碌、哪些待回收。索引表就像一张人员花名册如果花名册和实际人员对不上说明有线程资源没有按流程走顺着日志找第一处对不上的地方基本就是问题根源。5.2 从固定索引扩展到动态线程池方法3以固定数组为基础优点是逻辑简单、无动态内存分配风险缺点是最大并发数被数组容量限制。如果你的任务数量波动很大建议在索引方案之上再做一次升级改成动态线程池模式。动态线程池的核心还是索引表只不过线程不再是一次性创建、用完就释放而是创建后常驻任务来了就分配到空闲常驻线程任务结束线程不销毁回到空闲状态继续等待。乐玩对象可以一直保留在线程里减少反复创建、释放对象带来的开销。这种情况下索引表的状态字段要增加一个“线程空闲”状态和“任务空闲”区分开。我做这种改造时还顺手加了一个“任务队列”就是把这轮所有要执行的找图任务先放进队列线程池里的线程各自从队列里取下一个任务。这样做的好处是即使任务比线程多很多倍也能按顺序逐个消化不会出现线程互相抢任务的问题。这个方案的思路和方法3一脉相承只是把“任务参数”变成“任务队列元素”核心的索引隔离思想完全保留。5.3 状态同步与多线程配合的小技巧多线程不像单线程那样可以随便读写全局变量一旦多个线程同时改一个变量很可能互相覆盖最后的值就不确定了。所以在索引模块里任何对索引表字段的修改都要确保在临界区保护下进行。即使只是把状态从“忙碌”改成“待回收”这样一个简单的赋值也应该走临界区不要以为“就一行代码”而跳过锁。有人可能会纠结性能频繁进出临界区会不会很慢实测下来临界区做一次进入和退出开销非常小而乐玩找图一次动辄几十毫秒甚至几百毫秒索引读写那点时间完全可忽略。真正影响性能的从来不是锁本身而是把耗时的业务放进了锁里。只要锁保护范围正确哪怕几百个线程同时申请槽位也不会卡。我个人在实际操作中还有一个体会索引方案写完后不要马上堆功能先把最基本的“创建线程-执行找图-释放索引”这条链路跑上一轮确认没有任何崩溃再逐步加入任务队列、看门狗、日志统计这些增强功能。多线程模块最怕的就是功能太多、变量混在一起出了问题连定位都不知道从哪里下手。索引表的作用就是让问题能快速定位到具体槽位你先把这条主线走通后面加什么都心里有底。

相关新闻

Apollo-11源码解析:嵌入式高可靠系统设计启示

Apollo-11源码解析:嵌入式高可靠系统设计启示

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

2026/10/15 5:03:07 阅读更多 →
Android传统蓝牙聊天室开发实战:RFCOMM连接与权限适配

Android传统蓝牙聊天室开发实战:RFCOMM连接与权限适配

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

2026/10/15 5:03:07 阅读更多 →
HTML面试题必备清单,再也不怕丢失!

HTML面试题必备清单,再也不怕丢失!

每次面试都得看一遍面试题,每次准备的都放在了 Word 上,但是都误删丢失了,所以记录在这个地方吧。html面试题问题:什么是语义化标签?为什么要使用语义化标签?答案:语义化标签是指使用具有明确含义的 HTML 标签来描述页面内容,如 <header>、<nav>、<main…

2026/10/15 5:03:07 阅读更多 →

最新新闻

SMU02C监控单元实战排障与网管对接全指南

SMU02C监控单元实战排障与网管对接全指南

简介&#xff1a;本资源为华为SMU02C站点监控单元&#xff08;V500R001C50版本&#xff09;官方用户手册PDF文档&#xff0c;面向通信电源系统领域的销售工程师、技术支持工程师及现场维护人员&#xff0c;用于掌握该智能监控模块的安装部署、多方式管理&#xff08;LCD本地操作…

2026/10/15 5:48:37 阅读更多 →
JavaScript汉字拆分:解决UTF-16代理对导致的字符误切问题

JavaScript汉字拆分:解决UTF-16代理对导致的字符误切问题

简介&#xff1a;这是一份面向前端开发者与汉字信息处理学习者的JavaScript汉字结构分析工具包&#xff0c;聚焦于汉字部首与部件的程序化拆分逻辑&#xff0c;适用于汉字教学系统、输入法开发、搜索引擎优化等场景。资源以单个Word文档&#xff08;.doc&#xff09;形式提供&a…

2026/10/15 5:48:37 阅读更多 →
Redis消息队列实战:三种实现原理、坑点与选型指南

Redis消息队列实战:三种实现原理、坑点与选型指南

还记得那年夏天&#xff0c;我面某头部大厂后端岗位&#xff0c;二面的时候&#xff0c;面试官冷不丁问了一句&#xff1a;“Redis 能做消息队列吗&#xff1f;怎么实现&#xff1f;”当时我条件反射先把能做的三种方式背了一遍&#xff0c;结果他追问了一句&#xff1a;“那你…

2026/10/15 5:48:37 阅读更多 →
基于NSGA-II的柔性作业车间调度多目标优化与Matlab实现详解

基于NSGA-II的柔性作业车间调度多目标优化与Matlab实现详解

做过车间调度的朋友应该都有同感&#xff1a;柔性作业车间调度问题&#xff08;FJSP&#xff09;听起来只是经典作业车间调度加了一个"柔性"前缀&#xff0c;但真正上手去做多目标优化时&#xff0c;从编码设计、约束处理到Pareto前沿的可视化&#xff0c;每一步都是…

2026/10/15 5:48:37 阅读更多 →
Redis做消息队列?三种实现方案与生产环境避坑指南

Redis做消息队列?三种实现方案与生产环境避坑指南

前两天有位朋友跟我复盘面试&#xff0c;说在某大厂二面时&#xff0c;面试官冷不丁问了一句&#xff1a;Redis 能做消息队列吗&#xff1f;怎么实现&#xff1f;他当时有点慌&#xff0c;平时背过一堆 Redis 数据结构、缓存淘汰、分布式锁的知识&#xff0c;但这道题一出来&am…

2026/10/15 5:48:37 阅读更多 →
I2C、SMBus与PMBus协议本质区别及实战避坑指南

I2C、SMBus与PMBus协议本质区别及实战避坑指南

简介&#xff1a;本资源是一份面向嵌入式硬件工程师、电源系统设计人员及电子通信专业学习者的总线协议深度解析资料&#xff0c;聚焦I2C、SMBus与PMBus三大工业级串行通信协议的原理差异、应用场景与实现要点。内容系统梳理I2C基础架构&#xff08;含SDA/SCL时序、7/10位寻址、…

2026/10/15 5:47:36 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时&#xff0c;网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上&#xff0c;依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里&#xff0c;扩缩容到底难在哪做过大模型推理服务部署的人&#xff0c;大概都经历过这样的场景&#xff1a;一个团队共用一套推理集群&#xff0c;A 业务跑的是 7B 的小模型&#xff0c;B 业务跑的是 72B 的大模型&#xff0c;C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子&#xff1a;一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减&#xff0c;为了把启动时间压进两秒以内&#xff0c;我手贱地把一串自认为“没用”的 systemd 服务给 disable 了&#xff0c;其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →