TC 多线程的运用
一.理解进程与线程 在一个程序内部也可以实现多个任务并发执行,其中每个任务称为线程。 线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制流。 特点:线程不能独立运行,必须依赖于进程,在进程中运行。 每个程序至少有一个线程称为主线程。 单线程:只有一条线程的进程称为单线程 多线程:有不止一个线程的进程称为多线程
二、开启多线程的优点和缺点 提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。 充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。 当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用。
三、线程开启函数说明。 1. 函数原型----线程.开启(字符型 功能,字符型 功能参数) 这个是线程的开启方法,3.0版本对线程方法进行了改进,支持线程传参,不得不说,又是对线程操作的一大改进啊.(如果没得参数,传空值就好了)
3.0线程开启还改进了线程方法上下调用的问题,不管你线程方法是在线程开启的上面还是线程开启的下面,都可以直接通过开启线程来调用。
参数: 功能: 函数名的字符串(当前程序空间名 + 函数名)
功能参数: 线程传参,如果不需要参数,可填空字符串
2.函数原型--线程.扩展开启(字符型 开启功能,字符型 开启功能参数,字符型 结束功能,字符型 结束功能参数)
这个是线程扩展开启方法,3.0版本对线程扩展开启方法进行了改进,支持线程传参,不得不说,又是对线程操作的一大改进啊.(如果没得参数,传空值就好了)
3.0线程扩展开启还改进了线程扩展开启方法上下调用的问题,不管你线程方法是在线程扩展开启的上面还是下面,都可以直接通过开启线程来调用。
参数:
开启功能: 要开启的线程函数
开启功能参数: 线程开启时传入被调用函数的参数,如果不需要参数,可填空字符串 结束功能: 在线程结束时调用的函数(线程只能在正常关闭或结束情况下才会调用该函数)
结束功能参数: 线程关闭时传入被调用函数的参数,如果不需要参数,可填空字符串
举例: 一.简单的多线程操作,每个线程执行不同的任务。 1.流程图说明
2.详细举例
- 空间 我的程序
- //这是一个以"我的程序"命名的空间,下面的语句都在这个空间里实现
- 线程1
- //定义一个全局变量,来获取开启的线程
- 线程2
- //定义一个全局变量,来获取开启的线程
- 功能 任务1()
- 循环(真)
- //当条件为真时,该执行一个无限循环语句
- 辅助.等待(1000)
- //等待1000毫秒,然后再执行下面语句
- 辅助.消息框("执行任务1")
- //弹一个"执行任务1"的消息框
- 循环结束
- //循环结束语句
- 返回 真
- //函数返回语句
- 功能结束
- //功能函数用完后结束该功能
- 功能 任务2()
- 循环(真)
- //当条件为真时,该执行一个无限循环语句
- 辅助.等待(1000)
- //等待1000毫秒,然后再执行下面语句
- 辅助.消息框("执行任务2")
- //弹一个"执行任务1"的消息框
- 循环结束
- 返回 真
- 功能结束
- 功能 开始_点击()
- //这是主函数的入口处,语句的执行从这里开始
- 辅助.等待(1000)
- //等待1秒
- 线程1=线程.开启("我的程序.任务1","")
- //在我的程序这个空间开启线程任务1,并用线程编号1来获得
- 线程2=线程.开启("我的程序.线程方法2","")
- //在我的程序这个空间开启任务2,并用线程编号2来获得
- 如果结束
- 返回 真
- 功能结束
- 空间结束
- 执行结果:线程1和线程2同时运行。
复制代码 线程1每隔一秒弹出"执行任务1"
线程2每隔一秒弹出"执行任务2".
二.多线程执行同一个任务,这里我们通过临界区,来解决两个同时运行的线程抢操作问题。
1.流程图说明
空间 临界区
对象句柄 //定义一个全局的临界区句柄
功能 任务(访问线程)
线程.进入临界区(对象句柄) //进入临界区,这时候其他线程不能访问临界区中资源,想要访问的线程会被挂起等待
for(i=0;i<4;i++)
辅助.消息框("线程" +访问线程+"访问")
endfor
线程.离开临界区(对象句柄) //离开临界区,这时候其他线程可以访问临界区中的资源
返回 真
功能结束
功能 开始_点击()
对象句柄=线程.创建临界区() //创建临界区对象
i=10 //初始化 i
句柄A=线程.开启("临界区.任务","A")
句柄B=线程.开启("临界区.任务","B")
线程.删除临界区(对象句柄) //最后记得删除临界区对象释放资源,这时候如果在 线程.进入临界区(对象句柄) 程序就可能崩溃,因为对象不存在了
返回 真
功能结束
空间结束执行结果:线程A和线程B会同时访问任务方法(为了看清楚是那个线程方法,我们采用了线程传参的方法来分辨),但是我们用临界区来控制,一次只允许一个线程进入,可能是A或者B先访问。所以有可能是先弹出5次线程A访问或者5次线程B访问。
|