精易论坛

标题: 子程序打开超级列表框加载17000多数据,然后关闭主程序会卡 [打印本页]

作者: 吴杨520    时间: 昨天 23:20
标题: 子程序打开超级列表框加载17000多数据,然后关闭主程序会卡
子程序打开超级列表框1加载17000多数据,然后关闭主程序会卡5秒左右才能再次点按钮,有大佬怎么解决啊

作者: Marvin    时间: 昨天 23:24
这个问题的根本原因是:程序关闭时,主线程在等待加载数据的子线程结束,导致界面卡死。

17000条数据加载到超级列表框是一个耗时操作,如果你用子程序处理,但在关闭主程序时没有正确终止或处理这个子线程,就会出现以下情况:

子线程还在运行,主窗口关闭时等待它结束

超级列表框销毁时,有大量数据正在操作导致冲突

主线程被阻塞,等待子线程完成才能完全退出


方案一:正确使用线程

方案二:使用虚拟模式

方案三:分批加载 + 延迟关闭

方案四:使用数组缓冲

作者: bysy    时间: 昨天 23:24
你这个是加载 卡5秒吧 将可视改为 假加载完再设置为真 我记得禁止重画好像也行
作者: 吴杨520    时间: 昨天 23:25
Marvin 发表于 2026-7-14 23:24
这个问题的根本原因是:程序关闭时,主线程在等待加载数据的子线程结束,导致界面卡死。

17000条数据加载 ...

17000数据已经加载完成了,关闭还会那样
作者: a2083657    时间: 昨天 23:26
在_启动窗口_将被销毁事件下加一句:

超级列表框1.全部删除 ()

如果还卡,先设可视假再删:

超级列表框1.可视 = 假
超级列表框1.全部删除 ()
处理事件 ()   ' 让删除操作快速完成
作者: 吴杨520    时间: 昨天 23:26
bysy 发表于 2026-7-14 23:24
你这个是加载 卡5秒吧 将可视改为 假加载完再设置为真 我记得禁止重画好像也行 ...

是数据全部加载出来了 没数据了 关闭的时候主程序会卡5秒
作者: 吴杨520    时间: 昨天 23:31
a2083657 发表于 2026-7-14 23:26
在_启动窗口_将被销毁事件下加一句:

超级列表框1.全部删除 ()

主程序还是子程序里增加这个
作者: 吴杨520    时间: 昨天 23:37
.版本 2
.支持库 iext
.支持库 mysql

.程序集 窗口程序集_玩家排行
.程序集变量 本次记录集句柄, 整数型
.程序集变量 窗口正在关闭, 逻辑型

.子程序 _按钮1_被单击
.局部变量 sql句柄, 整数型
.局部变量 sql, 文本型
.局部变量 rs, 整数型
.局部变量 取前名次, 整数型
.局部变量 总行, 整数型
.局部变量 i, 整数型
.局部变量 排名, 整数型
.局部变量 ori_owner, 文本型
.局部变量 curr_owner, 文本型
.局部变量 pet_name, 文本型
.局部变量 star_str, 文本型
.局部变量 整数部分, 文本型
.局部变量 小数部分, 文本型
.局部变量 show_star, 文本型
.局部变量 type_str, 文本型
.局部变量 行索引, 整数型

sql句柄 = _启动窗口.全局数据库句柄
.如果真 (sql句柄 = 0)
    信息框 (“数据库未连接”, 0, “提示”, )
    返回 ()
.如果真结束

' 获取编辑框输入的名次数量,容错判断
取前名次 = 到整数 (编辑框1.内容)
.如果真 (取前名次 ≤ 0)
    信息框 (“请输入大于0的数字,例如500”, 0, “输入错误”, )
    返回 ()
.如果真结束

超级列表框1.全部删除 ()
排名 = 1
窗口正在关闭 = 假

' 先按星级降序排序,再截取前N名 = 星级最高前N名幻兽
sql = “SELECT e.ori_owner_name,e.name,e.star_lev,e.item_type,u.name FROM cq_eudemon e LEFT JOIN cq_user u ON e.owner_id = u.id ORDER BY e.star_lev DESC LIMIT 0,” + 到文本 (取前名次)
执行SQL语句 (sql句柄, sql)
rs = 取记录集 (sql句柄)
本次记录集句柄 = rs
总行 = 取记录集行数 (rs)

.如果真 (总行 = 0)
    释放记录集 (rs)
    本次记录集句柄 = 0
    信息框 (“暂无幻兽数据”, 0, “提示”, )
    返回 ()
.如果真结束

到首行 (rs)
.计次循环首 (总行, i)
    ' 关闭窗口中断循环
    .如果真 (窗口正在关闭 = 真)
        跳出循环 ()
    .如果真结束
    处理事件 ()

    读字段值 (rs, “ori_owner_name”, ori_owner)
    读字段值 (rs, “name”, pet_name)
    读字段值 (rs, “u.name”, curr_owner)
    读字段值 (rs, “star_lev”, star_str)
    读字段值 (rs, “item_type”, type_str)

    ' 星级格式化逻辑完全保留你原来的
    .如果真 (取文本长度 (star_str) ≤ 2)
        整数部分 = “0”
        小数部分 = star_str
    .如果真结束
    .如果真 (取文本长度 (star_str) > 2)
        整数部分 = 取文本左边 (star_str, 取文本长度 (star_str) - 2)
        小数部分 = 取文本右边 (star_str, 2)
    .如果真结束

    .如果真 (小数部分 = “00”)
        show_star = 整数部分
    .如果真结束
    .如果真 (小数部分 ≠ “00”)
        show_star = 整数部分 + “.” + 小数部分
    .如果真结束

    行索引 = 超级列表框1.插入表项 (, 到文本 (排名), , , , )
    超级列表框1.置标题 (行索引, 1, curr_owner)
    超级列表框1.置标题 (行索引, 2, ori_owner)
    超级列表框1.置标题 (行索引, 3, pet_name)
    超级列表框1.置标题 (行索引, 4, show_star)
    超级列表框1.置标题 (行索引, 5, type_str)

    排名 = 排名 + 1
    到下一行 (rs)
.计次循环尾 ()

' 释放数据库资源
.如果真 (本次记录集句柄 ≠ 0)
    释放记录集 (本次记录集句柄)
    本次记录集句柄 = 0
.如果真结束

.如果真 (窗口正在关闭 = 假)
    信息框 (“加载完成,共加载星级前” + 到文本 (取前名次) + “名,实际共” + 到文本 (总行) + “条”, 0, “完成”, )
.如果真结束


.子程序 _窗口_将被销毁

窗口正在关闭 = 真
' 仅释放数据库,删除列表那行删掉,解决关闭卡顿
.如果真 (本次记录集句柄 ≠ 0)
    释放记录集 (本次记录集句柄)
    本次记录集句柄 = 0
    超级列表框1.全部删除 ()
    处理事件 ()
.如果真结束


.子程序 _玩家排行_创建完毕

超级列表框1.全部删除 ()

.子程序 _玩家排行_将被销毁

超级列表框1.全部删除 ()
超级列表框1.可视 = 假
处理事件 ()

作者: zbj824650    时间: 昨天 23:39
_启动窗口  关闭事件添加,如果还是不行,只能进行数据优化了!
作者: Marvin    时间: 6 小时前
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
初始化随机数种子 ()
子程序名返回值类型公开备 注
_按钮_加载_被单击  
启动线程 (&加载超级列表框, , )
子程序名返回值类型公开备 注
加载超级列表框  
变量名类 型静态数组备 注
i整数型 
索引整数型 
超级列表框1.可视 = 假
超级列表框1.禁止重画 ()
超级列表框1.全部删除 ()
计次循环首 (17000, i)
索引 = 超级列表框1.插入表项 (, , , , , )
超级列表框1.置标题 (索引, 0, 到文本 (i))
超级列表框1.置标题 (索引, 1, 到文本 (取随机数 (1, 10000)))
计次循环尾 ()
超级列表框1.允许重画 ()
超级列表框1.可视 = 真
调试输出 (“加载完成,共”到文本 (超级列表框1.取表项数 ()) + “条”)


i支持库列表   支持库注释   
EThread多线程支持库
iext扩展界面支持库一
spec特殊功能支持库


作者: 算法艺术家    时间: 4 小时前
放线程里加载,然后加载的时候可视假 禁止重画
作者: acctv667    时间: 3 小时前
用虚表         




欢迎光临 精易论坛 (https://bbs.ijingyi.com/) Powered by Discuz! X3.4