之前一直被易语言多线程给困扰,总是碰到各种各样的问题,直到看到下面的教学例子,突然豁然开朗,感觉任督二脉被打开。看懂这个例子,就会对易语言鱼刺模块的多线程使用有个差不多的了解,可以满足日常使用。
易语言鱼刺模块多线程开源实例

.版本 2
.支持库 iext

.程序集 窗口程序集_启动窗口
.程序集变量 线程池, 鱼刺类_线程池Ex
.程序集变量 临界, 鱼刺类_临界许可
.程序集变量 线程, 鱼刺类_线程操作
.程序集变量 集_线程句柄, 整数型

.子程序 _按钮_登录_被单击
.局部变量 注册结果, 逻辑型

' 注册结果 = 注册子程序 (编辑框_邮箱.内容, 编辑框_密码.内容)
.如果 (注册结果)
    信息框 (“登录成功!”, 0, , )
.否则
    信息框 (“登录失败!”, 0, , )
.如果结束


.子程序 注册子程序, 逻辑型
.参数 注册邮箱, 文本型
.参数 注册密码, 文本型
.局部变量 提交地址, 文本型
.局部变量 返回文本, 文本型
.局部变量 Cookie, 文本型
.局部变量 提交参数, 文本型
.局部变量 返回协议头, 文本型

提交地址 = “http://www.hoolay.cn/regist”
返回文本 = 到文本 (网页_访问_对象 (提交地址, , , “”, Cookie, , , , , , , , , , , , ))  ' 初始化注册提交cookie
' 调试输出 (Cookie)
提交地址 = “http://www.hoolay.cn/regist?type=fan”
提交参数 = “uid=” + 编码_URL编码 (注册邮箱, 真, 真) + “&password=” + 注册密码
返回文本 = 到文本 (网页_访问_对象 (提交地址, 1, 提交参数, Cookie, , , 返回协议头, , 真, , , , , , , , ))  ' 提交注册
' 调试输出 (返回协议头, Cookie)
' login
.如果 (寻找文本 (返回协议头, “www.hoolay.cn/login”, , 假) ≠ -1)
    .循环判断首 ()
        提交地址 = 文本_取出中间文本 (返回协议头, “Location: ”, #换行符, , )
        .如果真 (提交地址 = “”)
            跳出循环 ()
        .如果真结束
        返回文本 = 到文本 (网页_访问_对象 (提交地址, , , Cookie, , , 返回协议头, , 真, , , , , , , , ))
    .循环判断尾 (真)
    返回 (真)
.否则
    返回 (假)
.如果结束


.子程序 _按钮_开始工作_被单击


.如果 (按钮_开始工作.标题 = “开始”)
    按钮_开始工作.标题 = “停止”
    .如果真 (线程池.取_执行线程数 () ≠ 0)
        返回 ()
    .如果真结束
    线程.创建 (&线程执行, , , , , , , , )
    按钮_开始工作.标题 = “停止”
    返回 ()
.否则
    .如果真 (按钮_开始工作.标题 = “停止”)
        线程池.销毁 (0, 20)
        按钮_开始工作.标题 = “开始”

    .如果真结束

.如果结束


.子程序 线程执行
.局部变量 线程数, 整数型
.局部变量 执行数量, 整数型
.局部变量 创建状态, 逻辑型
.局部变量 投递计次, 整数型
.局部变量 可用线程, 整数型
.局部变量 局_索引, 整数型
.局部变量 int, 整数型

线程数 = 到整数 (编辑框_线程数.内容)
执行数量 = 到整数 (编辑框_注册次数.内容)
.如果真 (线程数 > 执行数量)
    线程数 = 执行数量
.如果真结束
创建状态 = 线程池.创建 (线程数, 线程数, , , )
.如果真 (取反 (创建状态))
    log (“线程池创建失败,请重试!”)
    按钮_开始工作.标题 = “开始工作”
    按钮_暂停工作.禁止 = 真
    返回 ()
.如果真结束
log (“线程池创建成功<并发线程数:” + 到文本 (线程数) + “>”)
.判断循环首 (执行数量 > 投递计次)
    可用线程 = 线程池.取_空闲线程数 ()
    .如果真 (可用线程 > 0)
        int = 执行数量 - 投递计次
        .如果真 (int > 可用线程)
            int = 可用线程
        .如果真结束
        .计次循环首 (int, )
            局_索引 = 超级列表框1.插入表项 (, , , , , )
            超级列表框1.置标题 (局_索引, 0, 到文本 (局_索引 + 1))
            超级列表框1.置状态图片 (局_索引, 0)
            超级列表框1.保证显示 (局_索引)
            线程池.投递任务 (&调用子程序, 局_索引, )
            原子_递增 (投递计次)
            程序_延时 (50)
        .计次循环尾 ()
    .如果真结束

    .如果真 (线程池.等待任务动态 (, ) = 假)
        跳出循环 ()
    .如果真结束

.判断循环尾 ()
处理事件 ()
log (“等待线程结束...”)
.判断循环首 (线程池.取_是否空闲 () = 假)
    .如果真 (线程池.取_状态 () = #线程池_正在工作)
        跳出循环 ()
    .如果真结束
    .如果真 (线程池.等待任务动态 (100, ) = 假)
        跳出循环 ()
    .如果真结束
    处理事件 ()
.判断循环尾 ()
.如果真 (线程池.销毁 (0, , ))
    log (“线程销毁完成”)
.如果真结束
按钮_暂停工作.禁止 = 真
按钮_开始工作.标题 = “开始工作”

.子程序 调用子程序
.参数 sy, 整数型
.局部变量 随机邮箱, 文本型
.局部变量 随机密码, 文本型
.局部变量 注册结果, 逻辑型

临界.进入 ()

随机邮箱 = 文本_取随机字母 (6, 2) + 文本_取随机数字 (2, ) + “@163.com”
随机密码 = 文本_取随机字母 (6, 2) + 文本_取随机数字 (2, )
超级列表框1.置标题 (sy, 0, 到文本 (sy + 1))
超级列表框1.置标题 (sy, 1, 随机邮箱)
超级列表框1.置标题 (sy, 2, 随机密码)
超级列表框1.置标题 (sy, 3, “正在注册”)
临界.退出 ()
注册结果 = 注册子程序 (随机邮箱, 随机密码)
临界.进入 ()
超级列表框1.置标题 (sy, 3, 选择 (注册结果 = 真, “注册成功”, “注册失败”))
临界.退出 ()
返回 ()

.子程序 _按钮_暂停工作_被单击
.局部变量 状态, 逻辑型

.如果 (按钮_暂停工作.标题 = “继续”)
    线程池.继续 ()
    按钮_暂停工作.标题 = “暂停”
.否则
    .如果真 (按钮_暂停工作.标题 = “暂停”)
        线程池.暂停 ()
        编辑框_日志.加入文本 (“已暂停线程”)
        按钮_暂停工作.标题 = “继续”
    .如果真结束

.如果结束


.子程序 __启动窗口_创建完毕



.子程序 log
.参数 str, 文本型

临界.进入 ()
编辑框_日志.加入文本 (“[” + 时间_到文本 (, 1, 3) + “] ” + str + #换行符)
临界.退出 ()

易语言