TC官方合作论坛

标题: TC 多线程 [打印本页]

作者: TC管理员    时间: 2012-6-2 10:16
标题: TC 多线程
TC 多线程的运用

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

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

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

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

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

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.流程图说明
[attach]3624[/attach]
    空间 临界区
    对象句柄 //定义一个全局的临界区句柄
    功能 任务(访问线程)
    线程.进入临界区(对象句柄) //进入临界区,这时候其他线程不能访问临界区中资源,想要访问的线程会被挂起等待
    for(i=0;i<4;i++)
    辅助.消息框("线程" +访问线程+"访问")
    endfor
    线程.离开临界区(对象句柄) //离开临界区,这时候其他线程可以访问临界区中的资源
    返回 真
    功能结束

    功能 开始_点击()
    对象句柄=线程.创建临界区() //创建临界区对象
    i=10 //初始化 i
    句柄A=线程.开启("临界区.任务","A")
    句柄B=线程.开启("临界区.任务","B")
    线程.删除临界区(对象句柄) //最后记得删除临界区对象释放资源,这时候如果在 线程.进入临界区(对象句柄) 程序就可能崩溃,因为对象不存在了
    返回 真
    功能结束
    空间结束执行结果:线程A和线程B会同时访问任务方法(为了看清楚是那个线程方法,我们采用了线程传参的方法来分辨),但是我们用临界区来控制,一次只允许一个线程进入,可能是A或者B先访问。所以有可能是先弹出5次线程A访问或者5次线程B访问。




作者: 无情的冷风    时间: 2012-6-2 10:55
支持东哥,支持TC。
作者: TakeBobo    时间: 2012-6-2 10:56
学习了 。
作者: 麦兜兄弟    时间: 2012-6-2 11:11
好好学习一下。。
作者: 落叶归根    时间: 2012-6-2 11:23
看看 。。东哥  给力啊。。
作者: 战斗之神    时间: 2012-6-2 11:24
给力的说。 是不是官方所有教程都更新看? 我看TC教程里面都是 最新的 帖子。。
作者: 花开花落    时间: 2012-6-2 13:50
标题: TC多线程
学习了,TC教材这块好像都更新了。


作者: 战地之王    时间: 2012-6-2 13:51
终于晓得临界区了。。
作者: 陌上青衣。    时间: 2012-6-2 16:09
这个不收藏的话就亏本了
作者: xexexan    时间: 2012-6-2 16:43
多谢................
作者: jianyuanit    时间: 2012-6-8 15:58
多线程的运用 好..........
不错
作者: dder123    时间: 2012-6-14 08:37
看不懂,好像很厉害的样子……
作者: wz1wz    时间: 2012-6-30 18:34
发现小东没有

线程.关闭(线程句柄)
作者: chanos    时间: 2012-7-1 09:50
代码一里这两行有问题:

37 线程2=线程.开启("我的程序.线程方法2","")
39 如果结束

这两行要改为
线程2=线程.开启("我的程序.任务2","")
如果结束//这行要取消

-------------------------------------------------------------------------------------
代码二
14      i=10 //初始化 i
未定义变量类型

这行可删掉
-----------------------------------------------------------------------------------------
不知道改的对不对?
我在点击开始或退出都没反应,求解???






作者: chanos    时间: 2012-7-1 10:08
TC 多线程的运用

一.理解进程与线程

小东 发表于 2012-6-2 10:16:35

代码一里这两行有问题:

37 线程2=线程.开启("我的程序.线程方法2","")
39 如果结束

这两行要改为
线程2=线程.开启("我的程序.任务2","")
如果结束//这行要取消

-------------------------------------------------------------------------------------
代码二
14      i=10 //初始化 i
未定义变量类型

这行可删掉
-----------------------------------------------------------------------------------------
不知道改的对不对?
我在点击开始或退出都没反应,求解???


作者: 最爱念    时间: 2012-7-4 12:18
这个多线程很重要,要认真学习一下
作者: 信仰在心中    时间: 2012-7-16 09:53
给力啊
作者: m920006466    时间: 2012-7-18 22:15
很好,很容易理解
作者: loyili    时间: 2012-7-21 23:33
学习了,谢谢
作者: 向前冲一冲    时间: 2012-7-23 02:02
学习下
作者: kovsko    时间: 2012-7-23 10:21
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: scj2zxy    时间: 2012-8-21 16:50
学习中!
作者: stxuhong    时间: 2012-8-23 21:49
回复 1楼TC管理员的帖子

我要奖励1000个TC币,你的第37行错了,应该改成:线程2=线程.开启("我的程序.任务2",""),我发现问题我觉得应该奖励我,让我生活更加美好,让TC更加强大
作者: 醉卧美人膝    时间: 2012-8-24 16:41
非常不错~~~~~~~~
作者: joejiang    时间: 2012-9-2 17:51
多好的教程,顶了,学习了
作者: scj2zxy    时间: 2012-9-4 09:01
学习了
作者: lqqqsh    时间: 2012-9-6 00:19
好棒哦 、、哈哈
作者: lqqqsh    时间: 2012-9-6 00:20
TC不错的软件
作者: a0a1_a2a3    时间: 2012-9-11 10:56
学习
作者: lihonjian    时间: 2012-9-11 11:19
谢谢
作者: zc317414    时间: 2012-9-16 15:48
支持一下!
作者: mengtianxi    时间: 2012-9-18 16:10

作者: iceangellion    时间: 2012-9-24 12:02
谢谢
作者: zajykyr    时间: 2012-10-3 13:39
我复制代码到TC里,什么都没执行呢???
作者: 月下西柳风    时间: 2012-10-9 22:55
学习
作者: wohwos    时间: 2012-10-23 19:28
学习了!~~
作者: 719882988    时间: 2012-10-27 03:07
老大,貌似有一处错误耶  第37步:线程2=线程.开启("我的程序.线程方法2","")
应该是:线程2=线程.开启("我的程序.任务2",""),对吧?
作者: 719882988    时间: 2012-10-27 09:08
回复 35楼zajykyr的帖子

代码本身有2出错误
作者: webboc    时间: 2012-11-7 20:10
新人报道~学习一下,多开么?
作者: pll5422    时间: 2013-1-1 15:39
太棒了,正需要的就是这个。
作者: karasaig    时间: 2013-1-2 15:26
学习了
作者: 雨碎江南    时间: 2013-1-18 22:29
呵呵
作者: markwxg    时间: 2013-1-19 18:51
学习中,不过貌似第二段代码无法执行,我win7 32位系统
作者: aa6223994    时间: 2013-1-22 18:32
支持正好想看下临界区怎么应用这里就有了,很感谢啊,好人一生平安.
作者: tutoulaoli    时间: 2013-1-31 21:36
好好学习
作者: jsdai    时间: 2013-2-5 23:41
收藏先....
作者: zhmap    时间: 2013-3-10 21:07
要好好学习
作者: laowantong    时间: 2013-3-11 10:10
学习
作者: caiyucai    时间: 2013-3-20 01:34
学习了
作者: laowantong    时间: 2013-3-20 07:52
学习
作者: 26666180    时间: 2013-3-31 17:04
[code][/code]
作者: 黑道神话    时间: 2013-4-6 09:54
菜鸟路过
作者: by烟仔    时间: 2013-4-25 13:10
我是来学习的
作者: a363689    时间: 2013-5-7 21:47
好多西!!!!!!!!
作者: az485230    时间: 2013-5-8 07:11
不知所云
作者: qq756006485    时间: 2013-5-22 10:13
找的就是这....顶完再看一遍
作者: liyangchuantc    时间: 2013-6-1 21:26
。。。。。。。。。。
作者: fupinggui    时间: 2013-8-31 16:15
还是不懂
作者: fupinggui    时间: 2013-8-31 16:18
回复 35楼zajykyr的帖子

代码有2行事错的
作者: liexren    时间: 2013-10-11 00:59

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

    如果结束

以上2个代码有错误
另外复制代码进去的时候大家要注意”我的程序“这个空间名要改为你开始创建时候的空间名,不然点开始会没有反应的
作者: silei3058    时间: 2013-10-19 04:58
支持TC
作者: slz336    时间: 2014-8-26 13:38
支持啊!下载了
作者: actor1005    时间: 2016-4-1 11: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





欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1