本帖最后由 易造轮 于 2026-7-19 07:03 编辑
类_IOCP日志框v1.7.e
(27.9 KB, 下载次数: 70, 售价: 5 枚 精币)
大家好,在开发高频通信、多线程或大型项目时,日志记录往往是导致程序卡顿、甚至崩溃的隐形杀手。为了彻底解决这个问题,本人封装了一个基于 Windows IOCP(完成端口)机制的异步日志组件。
经过反复测试与打磨,推出了 v1.7 版本。本版本重构了底层内存与状态机逻辑,彻底解决了以往多线程日志组件中常见的“死锁、内存泄漏、UI假死、空指针崩溃”等顽疾,目前已达商业级稳定标准,现开源分享给大家。
核心特性
- 真·异步不卡顿:基于 IOCP 完成端口,所有文件写入和 UI 刷新均在独立后台线程执行,调用
输出() 方法瞬间返回,绝不阻塞主线程或业务线程。
- 无锁化设计:核心计数器采用
InterlockedIncrement 原子操作,避免临界区等待,多线程并发性能极高。
- 智能 UI 联动:自带超级列表框绑定,日志超 2000 条自动清空(避免逐行删除带来的严重 UI 假死),超长文本自动截断并提示。
- 非阻塞弹窗提示:支持严重错误弹窗提醒。弹窗逻辑在独立线程执行,即使不点“确定”,也完全不影响后续日志的记录和程序的运行。
- 安全销毁机制:严格的状态机保护(未启动/运行中/正在创建/正在销毁)。销毁时自动等待队列排空,绝不碰已释放的 UI 组件,防止退出时闪退。
v1.7 核心更新记录(重点)
相较于旧版,本版本修复了多个致命隐患:
- 【修复空指针崩溃】:当传递空的日志类型时,旧版底层
指针到文本(0) 会引发 0xC0000005 崩溃;新版增加严格指针校验,安全处理空文本。
- 【修复计数器死锁】:重构
输出 方法逻辑,严格保证“只有 IOCP 投递成功才递减计数”。旧版中若内存分配失败或投递失败,会导致 m_Count 无法归零,最终引发 销毁() 时程序彻底死锁。
- 【修复 UI 严重假死】:旧版列表框超限时采用循环删除 1500 行,由于跨线程
SendMessage 同步特性,会导致 UI 线程被霸占卡死。新版改为瞬间 全部删除,丝滑流畅。
- 【修复内存泄漏】:完善了分配失败时的现场清理逻辑,杜绝了孤立的内存堆。
- 【修复文件轮替死循环】:优化了日志文件创建逻辑,强制预创建空文件,避免目录权限或异常导致的“一直重复提示更替日期”死循环。
调用示例
极其简洁,开箱即用:
.局部变量 我的日志, 类_IOCP日志框
' 1. 创建并绑定超级列表框
我的日志.创建 (超级列表框1, , , , )
' 2. 常规记录日志 (不卡UI,瞬间写入文件和列表框)
我的日志.输出 (“用户登录成功,IP: 192.168.1.1”, “系统消息”, , )
' 3. 严重错误记录并弹窗 (弹窗独立线程,不卡主程序,后台继续记录)
我的日志.输出 (“数据库连接断开!”, “致命错误”, 假, 真)
技术细节分享:为什么不用 PostMessage 更新 UI?
作为模块,外部窗口句柄未知,无法直接 PostMessage。本组件采用跨线程直接调用组件方法(底层 SendMessage 同步)。虽然这是妥协方案,但通过限制单次调用频率和规避大量循环操作,在实际高频测试中表现出了极高的稳定性。如果外部有其他线程也在修改该列表框,建议外部自行加临界区保护,但切忌在持有临界区时等待后台线程,以免死锁。
|