|
|
停止闪退通常是线程或组件释放顺序问题。下载线程还在运行,你直接销毁窗口或强制结束线程会导致内存访问冲突。
改法:
1. 定义一个程序集或全局逻辑变量 是否停止,初始假。
2. 停止按钮按下时,把 是否停止 设为真。
3. 下载循环中每轮检查这个变量,真则跳出循环、清理资源。
4. 最后线程自然结束,再关闭窗口。
简单示例(关键部分):
```e
.版本 2
.程序集 窗口程序集_启动窗口
.全局变量 是否停止, 逻辑型
.子程序 _按钮_停止_被单击
是否停止 = 真
.子程序 _按钮_下载_被单击
.局部变量 局_线程句柄, 整数型
是否停止 = 假
局_线程句柄 = 线程_启动 (&下载线程)
.子程序 下载线程
.局部变量 局_数据, 字节集
.局部变量 局_循环, 整数型
.局部变量 局_文件号, 整数型
局_文件号 = 打开文件 (“c:\1.zip”, #重写, )
如果真 (局_文件号 = 0) 返回
循环判断首 ()
局_数据 = HTTP读文件 (“http://...”, , , , , , , )
如果真 (取字节集长度 (局_数据) = 0) 跳出循环
写出字节集 (局_文件号, 局_数据)
处理事件 ()
如果真 (是否停止) 跳出循环
循环判断尾 (假)
关闭文件 (局_文件号)
是否停止 = 假
信息框 (“下载结束”, 0, )
```
注意:不能直接用 强制结束线程 或 销毁窗口。
把停止按钮代码只写 是否停止 = 真,然后线程自然退出即可。 |
|