开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1447|回复: 8
收起左侧

[界面分享] 闭时等待程序走完在自动销毁的命令

[复制链接]
结帖率:83% (5/6)
发表于 2026-4-23 13:07:43 | 显示全部楼层 |阅读模式   福建省福州市
各位大哥,易语言有没有类似,再关闭软件时等待所有程序走完在关闭的命令?
目前我写的获取网络图片,总是在关闭时报错组件未载入,因为时实时获取会有延迟,有没有在关闭时等待程序走完在自动销毁的命令呢?
结帖率:60% (3/5)

签到天数: 10 天

发表于 2026-7-24 09:27:46 | 显示全部楼层   广东省深圳市
不太建议用。


  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
g_全局取消令牌整数型  
g_线程句柄组整数型0 

子程序名返回值类型公开备 注
_启动子程序整数型 请在本子程序中放置易模块初始化代码
_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
_临时子程序  
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
子程序名返回值类型公开备 注
创建任务逻辑型 创建并启动后台定时任务。成功返回真,失败返回假。
变量名类 型静态数组备 注
临时句柄整数型 
g_全局取消令牌 = CreateEventA (0, 真, 假, 0)  ' 手动重置
如果真 (g_全局取消令牌 = 0)
返回 ()
' 增加任务线程 1
临时句柄 = CreateThread (0, 0, 到整数 (&计划任务线程范例), 0, 0, 0)
加入成员 (g_线程句柄组, 临时句柄)
' 增加任务线程 2
临时句柄 = CreateThread (0, 0, 到整数 (&计划任务线程范例), 0, 0, 0)  ' 根据需求添加不同任务
加入成员 (g_线程句柄组, 临时句柄)
' ... 添加更多
返回 ()
子程序名返回值类型公开备 注
计划任务线程范例  
变量名类 型静态数组备 注
ret整数型 
重试次数整数型 
请求成功逻辑型 
' === 首次等待 ===
ret = WaitForSingleObject (g_全局取消令牌, 30000)  ' 30秒 = 30000毫秒
如果真 (ret = 0)  ' 返回0表示收到退出信号(SetEvent触发)
输出调试文本 (取程序名称 (1)“|线程首次等待期间被退出”)
返回 ()  ' 直接退出,不执行任何任务
' === 首次任务 ===
' (首次等待后立即执行的一次任务,写在这里,不需要可以删)
' === 后续循环等待 ===
判断循环首 (WaitForSingleObject (g_全局取消令牌, 30000)#_WAIT_TIMEOUT )  ' 258表示超时
' ==============================
' 执行的任务写在这里
' ↓ 下面是 全局中断、延时 范例↓
判断循环首 (重试次数 < 3)
' ... 执行网络请求 ...
. ' 如果真 (请求成功)
' 跳出循环 ()
' 请求失败,等待 5 秒后重试
如果真 (WaitForSingleObject (g_全局取消令牌, 5000) = 0)  ' 0 代表收到了退出信号!
跳出循环 ()  ' 重试期间收到退出信号,强制中止任务; 直接退出当前任务线程,不再重试!
' 如果返回 258,说明等了5秒,继续循环重试:等效于延时
判断循环尾 ()
' ==============================
判断循环尾 ()
输出调试文本 (“XX|计划任务线程|正常退出”)
返回 (0)
子程序名返回值类型公开备 注
销毁所有任务  
参数名类 型参考可空数组备 注
参_是否在UI线程执行逻辑型
变量名类 型静态数组备 注
i整数型 
Code整数型 
hThread整数型 
' 1. 一键通知所有线程退出
SetEvent (g_全局取消令牌)
' 2. 判断是否在UI线程
如果真 (是否为空 (参_是否在UI线程执行) IsGUIThread ())
参_是否在UI线程执行 = 真
' 3. 遍历所有线程句柄,依次等待退出
计次循环首 (取数组成员数 (g_线程句柄组), i)
hThread = g_线程句柄组 [i]
如果真 (hThread ≠ 0)
如果 (参_是否在UI线程执行 = )
' UI线程:边等边处理事件
Code = MsgWaitForMultipleObjects (1, hThread, 假, #_INFINITE, #_QS_ALLEVENTS )
判断循环首 (Code = 1)
处理事件 ()
Code = MsgWaitForMultipleObjects (1, hThread, 假, #_INFINITE, #_QS_ALLEVENTS )
判断循环尾 ()
' 非UI线程:死等
WaitForSingleObject (hThread, #_INFINITE )
' 关闭句柄并清空
CloseHandle (hThread)
g_线程句柄组 [i] = 0

计次循环尾 ()
' 4. 重置数组(清空成员)
重定义数组 (g_线程句柄组, 假, 0)
' 5. 关闭全局 Event (如果你确定软件要彻底退出了,关掉它;如果只是暂停任务,留着也行)
如果真 (g_全局取消令牌 ≠ 0)
CloseHandle (g_全局取消令牌)
g_全局取消令牌 = 0

窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
g_全局取消令牌整数型  
g_线程句柄组整数型0 

子程序名返回值类型公开备 注
_启动子程序整数型 请在本子程序中放置易模块初始化代码
_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
_临时子程序  
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
子程序名返回值类型公开备 注
创建任务逻辑型 创建并启动后台定时任务。成功返回真,失败返回假。
变量名类 型静态数组备 注
临时句柄整数型 
g_全局取消令牌 = CreateEventA (0, 真, 假, 0)  ' 手动重置
如果真 (g_全局取消令牌 = 0)
返回 ()
' 增加任务线程 1
临时句柄 = CreateThread (0, 0, 到整数 (&计划任务线程范例), 0, 0, 0)
加入成员 (g_线程句柄组, 临时句柄)
' 增加任务线程 2
临时句柄 = CreateThread (0, 0, 到整数 (&计划任务线程范例), 0, 0, 0)  ' 根据需求添加不同任务
加入成员 (g_线程句柄组, 临时句柄)
' ... 添加更多
返回 ()
子程序名返回值类型公开备 注
计划任务线程范例  
变量名类 型静态数组备 注
ret整数型 
重试次数整数型 
请求成功逻辑型 
' === 首次等待 ===
ret = WaitForSingleObject (g_全局取消令牌, 30000)  ' 30秒 = 30000毫秒
如果真 (ret = 0)  ' 返回0表示收到退出信号(SetEvent触发)
输出调试文本 (取程序名称 (1)“|线程首次等待期间被退出”)
返回 ()  ' 直接退出,不执行任何任务
' === 首次任务 ===
' (首次等待后立即执行的一次任务,写在这里,不需要可以删)
' === 后续循环等待 ===
判断循环首 (WaitForSingleObject (g_全局取消令牌, 30000)#_WAIT_TIMEOUT )  ' 258表示超时
' ==============================
' 执行的任务写在这里
' ↓ 下面是 全局中断、延时 范例↓
判断循环首 (重试次数 < 3)
' ... 执行网络请求 ...
. ' 如果真 (请求成功)
' 跳出循环 ()
' 请求失败,等待 5 秒后重试
如果真 (WaitForSingleObject (g_全局取消令牌, 5000) = 0)  ' 0 代表收到了退出信号!
跳出循环 ()  ' 重试期间收到退出信号,强制中止任务; 直接退出当前任务线程,不再重试!
' 如果返回 258,说明等了5秒,继续循环重试:等效于延时
判断循环尾 ()
' ==============================
判断循环尾 ()
输出调试文本 (“XX|计划任务线程|正常退出”)
返回 (0)
子程序名返回值类型公开备 注
销毁所有任务  
参数名类 型参考可空数组备 注
参_是否在UI线程执行逻辑型
变量名类 型静态数组备 注
i整数型 
Code整数型 
hThread整数型 
' 1. 一键通知所有线程退出
SetEvent (g_全局取消令牌)
' 2. 判断是否在UI线程
如果真 (是否为空 (参_是否在UI线程执行) IsGUIThread ())
参_是否在UI线程执行 = 真
' 3. 遍历所有线程句柄,依次等待退出
计次循环首 (取数组成员数 (g_线程句柄组), i)
hThread = g_线程句柄组 [i]
如果真 (hThread ≠ 0)
如果 (参_是否在UI线程执行 = )
' UI线程:边等边处理事件
Code = MsgWaitForMultipleObjects (1, hThread, 假, #_INFINITE, #_QS_ALLEVENTS )
判断循环首 (Code = 1)
处理事件 ()
Code = MsgWaitForMultipleObjects (1, hThread, 假, #_INFINITE, #_QS_ALLEVENTS )
判断循环尾 ()
' 非UI线程:死等
WaitForSingleObject (hThread, #_INFINITE )
' 关闭句柄并清空
CloseHandle (hThread)
g_线程句柄组 [i] = 0

计次循环尾 ()
' 4. 重置数组(清空成员)
重定义数组 (g_线程句柄组, 假, 0)
' 5. 关闭全局 Event (如果你确定软件要彻底退出了,关掉它;如果只是暂停任务,留着也行)
如果真 (g_全局取消令牌 ≠ 0)
CloseHandle (g_全局取消令牌)
g_全局取消令牌 = 0

常量名称常量值公 开备 注
_INFINITE-1 
_WAIT_OBJECT_00 
_WAIT_TIMEOUT258 
_QS_ALLEVENTS1215 


回复 支持 反对

使用道具 举报

结帖率:100% (37/37)
发表于 2026-6-2 22:26:37 | 显示全部楼层   江苏省苏州市
销毁所有 线程后 再销毁
回复 支持 反对

使用道具 举报

发表于 2026-4-29 15:03:39 | 显示全部楼层   安徽省宣城市
为博主点赞
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2026-4-23 19:45:08 | 显示全部楼层   海南省海口市
没看懂干什么用的
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2026-4-23 18:21:52 | 显示全部楼层   广东省揭阳市
raotao625 发表于 2026-4-23 16:20
窗口销毁前,对组件载入无效

那就自定义一个类,在类_销毁里面写,因为程序销毁时系统会自动调用销毁方法,把这个类弄个全局变量挂着就行,会自动触发这个方法
回复 支持 反对

使用道具 举报

结帖率:83% (5/6)
 楼主| 发表于 2026-4-23 16:20:13 | 显示全部楼层   福建省福州市
liuyue5086 发表于 2026-4-23 14:10
窗口程序不是有事件吗,_启动窗口,里面有个窗口销毁前,你自己写个延迟判断不就行了,确认无误再销毁 ...

窗口销毁前,对组件载入无效
回复 支持 反对

使用道具 举报

发表于 2026-4-23 16:04:52 | 显示全部楼层   辽宁省鞍山市
确实不错!赞!!!!!!!!!!
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2026-4-23 14:10:20 | 显示全部楼层   广东省揭阳市
窗口程序不是有事件吗,_启动窗口,里面有个窗口销毁前,你自己写个延迟判断不就行了,确认无误再销毁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表