易语言大漠多线程模板多线程结束

为了在线程结束时保证线程安全,首先采用WaitForSingleObject自然等待结束,设置了30s的等待时间,当自然结束失败时,如果等待自然线程失败,没有办法的情况下,只能强制粗暴的结束线程,同时我们对象对计数器进行恢复。

1、多线程_设置结束标志
2、多线程_结束
3、_内部结束
4、WaitForSingleObject
5、ReleaseRef

511遇见易语言多线程大漠多线程

源码:

.版本 2
.支持库 EThread
 
.子程序 多线程_设置结束标志, , , 在多线程全部结束时,加快结束的速度
.参数 主序号, 整数型
 
' 判断主序号
.如果真 (主序号 ≤ 0 或 主序号 ≥ MaxHwnd)
    返回 ()
 
.如果真结束
' 判断句柄
.如果真 (线程信息 [主序号].线程句柄 = 0)
    返回 ()
.如果真结束
 
' 主线程
线程信息 [主序号].是否结束 = 真
线程信息 [主序号].线程状态 = #线程状态_正在停止
' 副线程
线程信息 [主序号 + MaxHwnd].是否结束 = 真
线程信息 [主序号 + MaxHwnd].线程状态 = #线程状态_正在停止
 
' 大漠插件设置结束标志
线程信息 [主序号].dm.SetExitThread (1)
线程信息 [主序号 + MaxHwnd].dm.SetExitThread (1)
UI_更新 (主序号, #UI_更新)
 
 
.子程序 _内部结束, , , 这个接口是内部调用,不对外
.参数 主序号, 整数型
.局部变量 wait_time, 整数型
 
日志输出 (“结束  主序号:” + 到文本 (主序号))
多线程_设置结束标志 (主序号)
' 设置等待时间30秒
wait_time = 30 × 1000
' 主
.如果真 (线程信息 [主序号].线程句柄 ≠ 0)
    .如果真 (WaitForSingleObject (线程信息 [主序号].线程句柄, wait_time) ≠ 0)
        ' 如果等待自然线程失败,没有办法的情况下,只能强制粗暴的结束线程
        日志输出 (“主线程 等待线程失败,强制结束线程”)
        强制结束线程 (线程信息 [主序号].线程句柄)
 
    .如果真结束
 
    关闭线程句柄 (线程信息 [主序号].线程句柄)
 
.如果真结束
 
' 副
.如果真 (线程信息 [主序号 + MaxHwnd].线程句柄 ≠ 0)
    .如果真 (WaitForSingleObject (线程信息 [主序号 + MaxHwnd].线程句柄, wait_time) ≠ 0)
        日志输出 (“副线程 等待线程失败,强制结束线程”)
        强制结束线程 (线程信息 [主序号 + MaxHwnd].线程句柄)
 
    .如果真结束
 
    关闭线程句柄 (线程信息 [主序号].线程句柄)
 
.如果真结束
 
' 对象计数恢复
线程信息 [主序号].dm.ReleaseRef ()
线程信息 [主序号 + MaxHwnd].dm.ReleaseRef ()
' 释放对象
线程信息 [主序号].dm.释放 ()
线程信息 [主序号 + MaxHwnd].dm.释放 ()
 
.子程序 多线程_结束, , , 设置结束标识
.参数 主序号
 
 
' 判断主序号
.如果真 (主序号 ≤ 0 或 主序号 ≥ MaxHwnd)
    返回 ()
 
.如果真结束
' 判断句柄
.如果真 (线程信息 [主序号].线程句柄 = 0)
    返回 ()
.如果真结束
 
_内部结束 (主序号)
多线程_复位 (主序号)
多线程_复位 (主序号 + MaxHwnd)
 
UI_更新 (主序号, #UI_删除)
日志输出 (“线程结束成功 主序号:” + 到文本 (主序号))

源码:易语言大漠多线程模板-10多线程结束

 

你可能感兴趣的:(易语言,大漠,多线程,大漠多线程,大漠模板,多线程,大漠,511遇见)