TC官方合作论坛

 找回密码
 立即注册
查看: 2042|回复: 4

[已解决] 使用临界区实现多个线程 随时开启 随时关闭,不成熟,大大完善下

[复制链接]
发表于 2013-5-11 17:44:33 | 显示全部楼层 |阅读模式

马上加入TC

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

x
看了陌上青衣大神的2013-05-02TC官方YY教学之线程临界区和事件API的教程,附下教程地址:http://bbs.tyuyan.com/thread-26437-1-1.html
但是这个教程没有提到怎么实现多个线程可以随时开启 随时暂停,我自己琢摩的,不成熟希望大完善下,好了下面先上本次附件的界面图:

实现的功能就是两个用两个线程在列表框增加文本,当然这里要用到临界区
上代码:
空间 总的测试

句柄1,句柄2
临界区标志
记号1=0
记号2=0

功能 初始化()
//这里添加你要执行的代码
临界区标志=线程.创建临界区()
功能结束



功能 第一个()
        a=1
        
        循环(真)
               
                线程.进入临界区(临界区标志)  
                记号1=1
                列表框.增加文本("列表框0","第"&a&"次")
                辅助.等待(800)
                线程.离开临界区(临界区标志)
                记号1=0
                a++
                辅助.等待(1000)
               
        循环结束      
功能结束

功能 第二个()
        
        a=1
        循环(真)
                线程.进入临界区(临界区标志)
                记号2=1
                列表框.增加文本("列表框1","第"&a&"次")
                辅助.等待(800)
               
                线程.离开临界区(临界区标志)
                记号2=0
                a++
                辅助.等待(1000)
        循环结束      
功能结束






功能 循环1()
        循环(真)
                如果(记号1==0)
                        线程.关闭(句柄1,0)
                        跳出
                如果结束      
        循环结束
功能结束


功能 循环2()
        循环(真)
                如果(记号2==0)
                        线程.关闭(句柄2,0)
                        跳出
                如果结束      
        循环结束
功能结束



功能 开始_点击()
        句柄1=线程.开启("总的测试.第一个","")     
功能结束


功能 按钮0_点击()
        
        句柄2=线程.开启("总的测试.第二个","")
        
功能结束


功能 按钮1_点击()
      
线程句柄=线程.开启("总的测试.循环1","")
        辅助.等待(2000)
        线程.关闭(线程句柄)

        
功能结束



功能 按钮2_点击()
        

       线程句柄=线程.开启("总的测试.循环2","")
        辅助.等待(2000)
        线程.关闭(线程句柄)
        
功能结束







功能 退出_点击()
        
        辅助.退出()
功能结束

空间结束
这个帖子不是教大家怎么使用临界区的,不过可以参考,因为我本身也是个小白
  
不过现在的问题就是 在我开启线程之后,点击结束的时候,结束的按钮会卡顿 2秒,如果坐成商业脚本这个有弊端
这个是我本人呢对于临界区的理解,虽然实现了可能笨拙,大大们能教下其他的方法吗
回复

使用道具 举报

发表于 2017-8-31 12:20:30 | 显示全部楼层
呵呵,有一点点复杂,而且你忽略了一个临界区的一个特性,当某线程正在排队等待进入临界区时,此时关闭线程,这个线程也会照样进入临界区,占着临界区的,当然,你的进入临界区后的操作简短快速,影响不大,但如果进入临界区后的操作较多,需求时间较长时,影响就会比较明显.

记号1=1
线程.进入临界区(临界区标志)  

这两句调换一下位置后,可以防止"记号1"的线程碰巧在等待进入临界区状态时被结束.

另外可以考虑在有临界区的死循环线程上加入一个自结束的指令,这样可能程序比较清楚清晰.
//以下用5.x以上的写法了
定义一全局变量:  变量 是否结束线程数组=数组("句柄1"=假,"句柄2"=假)

功能 第一个()
    循环(真)
        如果(是否结束线程数组["句柄1"])
          句柄1 = 0
          是否结束线程数组["句柄1"] = 假
          跳出
        结束
        临界区进入(临界区标志)
        ......
        ......
        ......
        临界区离开(临界区标志)
    结束
结束

这样需要关闭句柄1时 赋值全局变量  是否结束线程数组["句柄1"]=真
然后循环检查句柄1==0时 就是已成功关闭句柄1的线程了

以上仅为纸上谈兵,没经过长时间暴力调试,若要应用到实际工作环境时请谨慎使用.
回复 支持 反对

使用道具 举报

发表于 2013-5-11 22:38:09 | 显示全部楼层
很用心的分享
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-31 13:28:24 | 显示全部楼层
chen71512 发表于 2017-8-31 12:20
呵呵,有一点点复杂,而且你忽略了一个临界区的一个特性,当某线程正在排队等待进入临界区时,此时关闭线程,这 ...

谢谢 这个是我刚学编程的时候 发的帖子 时间是 2013年

恩恩 谢谢 回复

学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-31 13:37:42 | 显示全部楼层
还有就是 我现在的经验看待我几年前发的帖子  颇有感触
编程的路还有很长
我现在写的程序 也用到了临界区  但是我抛弃了 结束线程的命令

因为程序 有的要运行好久 关闭了 然后开启 这样反复 理论上不是很好

我现在的办法是 程序需要哪些主要的线程 软件启动的时候 就 全部启动   线程是一个循环体 有一个开关 用到的时候在打开这个开关 就可以了
这样比较长时间的稳定
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-6-25 04:16 , Processed in 0.039927 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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