多线程操作

多线程是指从软件或者硬件上实现多个线程并发执行的技术、可以同时通过异步方式处理多条数据或任务、例如当遇到需要在同一时间获取大量后端数据进行初始化的业务场景时、或者要执行某些耗时操作的计算、使用多线程将不会引起程序卡顿;在轻舟中针对不同的业务场景支持多种多线程操作:

  • 异步执行语句

  • 线程组件

  • 内置线程函数

  • 异步函数

  • 线程使用案例

异步执行语句

该方式是使用多线程较为灵活的一种方式、适合在代码的任何位置使用;使用方法为:通过“异步执行首”、”异步执行尾“关键字包裹指定代码、被包裹的代码将会以子线程方式运行;例如:

事件 按钮1.被单击(源对象 为 视图)
    异步执行首
        变量 a = 取网页源码("","UTF-8",5000)
    异步执行尾
    ' 上方获取网页源码的代码将会在子线程中执行、而APP界面将不会产生卡顿、
    ' 但需要注意、在上方由“异步执行”包裹的代码块中不能直接将获取的值显示
    ' 到窗口组件中;因为在子线程中不能直接更新UI
    ' 但可以通过“到主线程”关键字、将线程切换到主线程、就可以更新窗口组件内容了
    ' 例如下方代码
    异步执行首
        变量 a = 取网页源码("","UTF-8",5000)
        变量 b = 取网页源码("","UTF-8",5000)
        到主线程
        编辑框1.内容 = a
        编辑框2.内容 = b
    异步执行尾
结束 事件

线程组件

该方式不同于第一种方式;而是使用线程组件来实现多线程的操作;适用于模块化开发、嵌套式、连续式、递归式数据处理、高并发同时需可控的业务场景中;以下为代码示例:

变量 线程1 为 线程
事件 按钮1.被单击(来源对象 为 视图)
    线程1 = 创建 线程()
    线程1.启动线程(&子线程获取数据,&线程1收到消息)
结束 事件

函数 子线程获取数据()
    变量 a 为 文本型
    a = 取网页源码("http://www.baidu.com","UTF-8",5000)
    '获取到后端数据后、发送给主线程
    线程1.发送消息(1,a)
    '此时如果要想获取其他数据、可以继续获取后继续发送
    变量 b 为 文本型
    b = 取网页源码("http://www.sohu.com","UTF-8",5000)
    线程1.发送消息(2,b)
结束 函数

'当在子线程中发送消息时、这个主线程的函数将会立即收到消息
函数 线程1收到消息(消息ID 为 整数型,消息值 为 对象)
   如果(消息ID == 1)
       编辑框1.追加文本行("源码1的内容:" + 到文本(对象))
   否则 如果(消息ID == 2)
       编辑框1.追加文本行("源码2的内容:" + 到文本(对象))
   结束 如果
结束 函数

内置线程函数

该方式采用内置函数“启动线程”实现多线程、使用简单、但功能较为单一;适用于一般较为简单的单线程、单任务的场景中;以下为代码演示:

事件 按钮1.被单击(来源对象 为 视图)
    启动线程(&子程序1)
结束 事件

函数 子程序1()
    调试输出("我是在子线程中执行的代码;可执行耗时操作")
结束 函数

异步函数

将函数在多线程中执行;与异步执行语句类似。

函数 获取网页数据并显示(URL地址 为 文本型) 为 异步
   变量 结果值 为 文本型
   结果值 = 取网页源码(URL地址,"UTF-8",5000)
   到主线程
   编辑框1.内容 = 结果值
结束 函数

线程使用案例

由于线程是在后台运行、并且不会卡程序、也不会使界面卡顿;因此非常适合作为后台常驻线程、执行后台循环任务、例如这里我们每隔2秒获取一次热点信息:

变量 线程1 为 线程
变量 执行任务 为 逻辑型
事件 按钮1.被单击(来源对象 为 视图)
    线程1 = 创建 线程()
    执行任务 = 真
    线程1.启动线程(&子线程获取数据,&线程1收到消息)
结束 事件

事件 按钮1.被单击(来源对象 为 视图)
    执行任务 = 假
结束 事件

函数 子线程获取数据()
    变量 a 为 文本型
    判断循环(执行任务)
        a = 取网页源码("http://www.hotmsg.com","UTF-8",5000)
        线程1.发送消息(1,a)
        延时(2000)
    结束循环
结束 函数

函数 线程1收到消息(消息ID 为 整数型,消息值 为 对象)
   如果(消息ID == 1)
       编辑框1.追加文本行("新的数据:" + 到文本(对象))
   结束 如果
结束 函数