TC官方合作论坛

 找回密码
 立即注册
查看: 13964|回复: 62
打印 上一主题 下一主题

[功能] TC 多线程

[复制链接]
跳转到指定楼层
楼主
发表于 2012-6-2 10:16:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
TC 多线程的运用

一.理解进程与线程
在一个程序内部也可以实现多个任务并发执行,其中每个任务称为线程。
线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制流。
特点:线程不能独立运行,必须依赖于进程,在进程中运行。
每个程序至少有一个线程称为主线程。
单线程:只有一条线程的进程称为单线程
多线程:有不止一个线程的进程称为多线程

二、开启多线程的优点和缺点
提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。
充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。
当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用。

三、线程开启函数说明。
    1. 函数原型----线程.开启(字符型  功能,字符型  功能参数)
    这个是线程的开启方法,3.0版本对线程方法进行了改进,支持线程传参,不得不说,又是对线程操作的一大改进啊.(如果没得参数,传空值就好了)
    3.0线程开启还改进了线程方法上下调用的问题,不管你线程方法是在线程开启的上面还是线程开启的下面,都可以直接通过开启线程来调用。
   
      参数:
          功能: 函数名的字符串(当前程序空间名 + 函数名)
          功能参数: 线程传参,如果不需要参数,可填空字符串

2.函数原型--线程.扩展开启(字符型 开启功能,字符型  开启功能参数,字符型 结束功能,字符型  结束功能参数)
    这个是线程扩展开启方法,3.0版本对线程扩展开启方法进行了改进,支持线程传参,不得不说,又是对线程操作的一大改进啊.(如果没得参数,传空值就好了)
        3.0线程扩展开启还改进了线程扩展开启方法上下调用的问题,不管你线程方法是在线程扩展开启的上面还是下面,都可以直接通过开启线程来调用。
  
   参数:
           开启功能: 要开启的线程函数
           开启功能参数: 线程开启时传入被调用函数的参数,如果不需要参数,可填空字符串
           结束功能: 在线程结束时调用的函数(线程只能在正常关闭或结束情况下才会调用该函数)
          结束功能参数: 线程关闭时传入被调用函数的参数,如果不需要参数,可填空字符串
   

举例:
一.简单的多线程操作,每个线程执行不同的任务。
1.流程图说明

2.
详细举例
  1.     空间 我的程序
  2.     //这是一个以"我的程序"命名的空间,下面的语句都在这个空间里实现
  3.     线程1
  4.     //定义一个全局变量,来获取开启的线程
  5.     线程2
  6.     //定义一个全局变量,来获取开启的线程
  7.     功能 任务1()
  8.     循环(真)
  9.     //当条件为真时,该执行一个无限循环语句
  10.     辅助.等待(1000)
  11.     //等待1000毫秒,然后再执行下面语句
  12.     辅助.消息框("执行任务1")
  13.     //弹一个"执行任务1"的消息框
  14.     循环结束
  15.     //循环结束语句
  16.     返回 真
  17.     //函数返回语句
  18.     功能结束
  19.     //功能函数用完后结束该功能

  20.     功能 任务2()
  21.     循环(真)
  22.     //当条件为真时,该执行一个无限循环语句
  23.     辅助.等待(1000)
  24.     //等待1000毫秒,然后再执行下面语句
  25.     辅助.消息框("执行任务2")
  26.     //弹一个"执行任务1"的消息框
  27.     循环结束
  28.     返回 真
  29.     功能结束
  30.     功能 开始_点击()
  31.     //这是主函数的入口处,语句的执行从这里开始
  32.     辅助.等待(1000)
  33.     //等待1秒
  34.     线程1=线程.开启("我的程序.任务1","")
  35.     //在我的程序这个空间开启线程任务1,并用线程编号1来获得
  36.     线程2=线程.开启("我的程序.线程方法2","")
  37.     //在我的程序这个空间开启任务2,并用线程编号2来获得
  38.     如果结束
  39.     返回 真
  40.     功能结束
  41.     空间结束

  42. 执行结果:线程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访问。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

64#
发表于 2016-4-1 11:12:12 | 只看该作者
哥们,你这临界区有问题啊,应该这样的吧。
var CriHandle
function visit(visitthread)
    criticalenter(CriHandle)
    for(var i = 0; i < 4; i++)
        //messagebox("线程"+ visitthread +"访问")
        traceprint("线程"& visitthread &"访问")
    end
   
    criticalleave(CriHandle)
    return true
   
   
end


function button0_click()
//这里添加你要执行的代码
        CriHandle=criticalcreate()
   
        var handleA=threadbegin("visit","A")
    var handleB=threadbegin("visit","B")
   
        traceprint("////////////////////分隔线/////////////////////////")


        //threadwaitfor(handleA,60*1000)//最长等待线程句柄1的线程执行1分钟
    //threadwaitfor(handleB,60*1000)//最长等待线程句柄2的线程执行1分钟     

        //必须加上下面语句,否则线程还没运行结束就删除临界区,程序崩溃
    while(!threadgetstatus(handleA)&&!threadgetstatus(handleB)==true)
                criticaldelete(CriHandle)
                exit()      
    end
   
    return true
   
end
回复 支持 反对

使用道具 举报

63#
发表于 2014-8-26 13:38:32 | 只看该作者
支持啊!下载了
回复 支持 反对

使用道具 举报

62#
发表于 2013-10-19 04:58:34 | 只看该作者
支持TC
回复 支持 反对

使用道具 举报

61#
发表于 2013-10-11 00:59:13 | 只看该作者

    线程2=线程.开启("我的程序.线程方法2","")

    如果结束

以上2个代码有错误
另外复制代码进去的时候大家要注意”我的程序“这个空间名要改为你开始创建时候的空间名,不然点开始会没有反应的
回复 支持 反对

使用道具 举报

60#
发表于 2013-8-31 16:18:06 | 只看该作者
回复 35楼zajykyr的帖子

代码有2行事错的
回复 支持 反对

使用道具 举报

59#
发表于 2013-8-31 16:15:19 | 只看该作者
还是不懂
回复 支持 反对

使用道具 举报

58#
发表于 2013-6-1 21:26:17 | 只看该作者
。。。。。。。。。。
回复 支持 反对

使用道具 举报

57#
发表于 2013-5-22 10:13:20 | 只看该作者
找的就是这....顶完再看一遍
回复 支持 反对

使用道具 举报

56#
发表于 2013-5-8 07:11:00 | 只看该作者
不知所云
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18043773号

GMT+8, 2025-9-17 07:42 , Processed in 0.183427 second(s), 26 queries .

Powered by 海安天坑软件科技有限公司

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表