YStudio Y++

多线程支持库

Y++ / YStudio 开发文档 · 一点滴

路径:支持库 → 多线程支持库。

硬约束

  1. 扁平命令;含「多线程操作」与「线程池操作」两类。
  2. 任务回调参数支持无参、标量、数组及混用——不必是数组。
  3. 禁止在界面事件里调用 等待线程 / 等待所有线程 / 等待线程池 / 等待任务。
  4. 禁对主/UI/当前线程 暂停线程 / 强制结束线程。
  5. 回写 UI 必须在界面线程(用完成/空闲事件)。
  6. 主窗口关闭时自动强制结束尚未回收的工作线程与线程池。

快速开始

函数 批量工作() {
    整数 句柄数组[]
    整数 i
    循环(10, i) {
        数组添加(句柄数组, 启动线程(&任务, i))
    }
    等待所有线程(句柄数组)
}
函数 任务(整数 n) {
    输出(n)
}
函数 按钮1.单击(整数 x, 整数 y) {
    启动线程(&批量工作)   // 立即返回,界面不卡
}

多线程操作

本分类共 6 条。

启动线程

  • 签名:整数 启动线程(&任务, i, 结果数组)
  • 说明:新建线程执行指定函数并立即返回句柄(不等待)。参数可为标量、数组或混用,不必是数组。
  • 参数一│函数名: 建议 &函数名;可跟若干参数(标量按值、数组按引用)

强制结束线程

  • 签名:逻辑 强制结束线程(整数 线程句柄)
  • 说明:强制终止工作线程并关闭句柄。
  • 参数一│线程句柄: 启动线程 返回的句柄

暂停线程

  • 签名:逻辑 暂停线程(整数 线程句柄)
  • 说明:暂停指定工作线程。
  • 参数一│线程句柄: 启动线程 返回的句柄

等待所有线程

  • 签名:通用 等待所有线程(数组 线程句柄数组)
  • 说明:等待多个线程全部执行完毕。
  • 参数一│线程句柄数组: 推荐用 数组添加 收集启动线程 返回值

等待线程

  • 签名:逻辑 等待线程(整数 线程句柄)
  • 说明:等待指定线程执行完毕。
  • 参数一│线程句柄: 启动线程 返回的句柄

继续线程

  • 签名:逻辑 继续线程(整数 线程句柄)
  • 说明:恢复被暂停的工作线程。
  • 参数一│线程句柄: 启动线程 返回的句柄

线程池操作

本分类共 11 条。

关闭线程池

  • 签名:逻辑 关闭线程池(整数 池句柄)
  • 说明:停止接新任务,排空后结束工作线程并释放池句柄。
  • 参数一│池句柄: 创建线程池 返回值

创建线程池

  • 签名:整数 创建线程池(0)
  • 说明:创建固定工作线程数的线程池。省略或 0 表示按 CPU 核数(至少 1)。
  • 参数一│线程数: 可选;0 或省略=自动;建议不要过大

取消排队任务

  • 签名:逻辑 取消排队任务(整数 池句柄, 整数 任务序号)
  • 说明:取消仍在排队、尚未开始执行的任务。已开始或已完成返回假。
  • 参数一│池句柄: 创建线程池 返回值
  • 参数二│任务序号: 投递任务 的返回值

取线程池工作中数

  • 签名:整数 取线程池工作中数(整数 池句柄)
  • 说明:返回正在执行中的任务数(通常 ≤ 工作线程数)。无效句柄返回 -1。
  • 参数一│池句柄: 创建线程池 返回值

取线程池排队数

  • 签名:整数 取线程池排队数(整数 池句柄)
  • 说明:返回尚未被工作线程取走的任务数。无效句柄返回 -1。
  • 参数一│池句柄: 创建线程池 返回值

取线程池线程数

  • 签名:整数 取线程池线程数(整数 池句柄)
  • 说明:返回创建时确定的工作线程数。无效句柄返回 -1。
  • 参数一│池句柄: 创建线程池 返回值

投递任务

  • 签名:整数 投递任务(池, &混用, i, "10", 结果数组)
  • 说明:将函数入队由池内空闲线程执行,立即返回。参数支持无参、标量、数组及混用,不必是数组。
  • 参数一│池句柄: 创建线程池 返回值
  • 参数二│函数名: 建议 &函数名;其后可跟标量(按值)和/或数组(按引用)

等待任务

  • 签名:逻辑 等待任务(整数 池句柄, 整数 任务序号)
  • 说明:等待指定任务完成或被取消。UI 线程调用时会泵消息,但仍勿在按钮事件里用。
  • 参数一│池句柄: 创建线程池 返回值
  • 参数二│任务序号: 投递任务 的返回值

等待线程池

  • 签名:逻辑 等待线程池(整数 池句柄)
  • 说明:等待池内排队与执行中的任务全部完成。
  • 参数一│池句柄: 创建线程池 返回值

置线程池完成事件

  • 签名:逻辑 置线程池完成事件(池, &任务完成)
  • 说明:每个任务在工作线程跑完后,于界面线程调用回调。可改控件标题等。传 0 清除。
  • 参数一│池句柄: 创建线程池 返回值
  • 参数二│回调: &函数名,形参固定 函数 名(整数 任务序号);传 0 清除

置线程池空闲事件

  • 签名:逻辑 置线程池空闲事件(池, &全部完成)
  • 说明:池由忙变空闲(排队与执行中均为 0)时,于界面线程调用无参回调。传 0 清除。
  • 参数一│池句柄: 创建线程池 返回值
  • 参数二│回调: &函数名,无参 函数 名();传 0 清除

推荐写法(不卡界面)

按钮里只启动,重活放函数里;大批量优先线程池 + 空闲/完成事件。

整数 池

函数 只算标量(整数 n) {
    // 重活在工作线程
}

函数 全部完成() {
    标签1.标题 = "全部完成"
    关闭线程池(池)
}

函数 按钮1.单击(整数 x, 整数 y) {
    池 = 创建线程池(0)
    置线程池空闲事件(池, &全部完成)
    整数 i
    循环(100, i) {
        投递任务(池, &只算标量, i)
    }
    // 立刻返回 —— 绝不在这里 等待线程池
}

要点:

  • 标量参数按值;数组参数按引用写回(写 整数 结果数组[])。
  • 下标从 0 起;循环(次数, i) 中 i 为 0..次数-1。
  • 池句柄与线程句柄不可混用。
  • 完成回调形参:函数 名(整数 任务序号);空闲回调无参。

易错对照

错误 正确
按钮里同步等待上千线程 等待放进被启动的函数,或用线程池事件
池句柄当线程句柄 两类句柄不可混用
在工作线程直接改控件 用完成/空闲事件回 UI 线程

相关

回调 · 定时器类 · 性能计时