小白学习C#和halcon联合日志(4)

 

今天主要是写一点多线程启动、结束,锁的应用,还有跨线程的应用,让线程进入等待状态。

1.多线程的创建、启动与锁

 

        首先还是创建一个窗体,具体流程之前已经有,这里就不过多赘述。

 

        然后设置一个label上默认文本为“票数”,再设置两个按钮并双击创建点击事件。

        在解决方案的你的项目中右击并找到熟悉,在上述图片中的输出类型选择控制台应用程序,这样就会出现“黑框框”而不是在主界面最下方的“输出”显示了。

        那么第一个案例来了,这里模拟抢票环节。总共有两张票,这里模拟了十个人来抢这张票。上方的GetTicket方法是判断这个人抢票成功与否。下方的则是第一个点击事件,对应开始抢票。这里写了一个for循环模拟出十个人,然后就是实例化类方便使用线程。实例化中使用"()=>{}"的方式调用了上面抢票的方法,再赋予每个进程ID后使用.Start()启动线程。

        第二个点击事件显示票数在定义的Label上。

        这就是第一个案例抢票的结果了,但是这里显然有一个问题,为什么for循环是从0开始到9但是这个进程抢票的时候却不是按0到9开始抢的。是因为for循环太快了,类似于十条赛道同时起跑的一个人。

        这里加了一个“锁”,在跑线程的过程中,如果10个线程同时进入抢票方法,且此时票数都是大于0的,这里会判定为都抢到了票且票数为负数,这显然是不现实的。这里加锁就是在一个线程进入这个方法后给这里上锁,其他线程无法进入,待本次判断结束后开锁等待下一个线程进入上锁,这样就不会有同时抢到票的情况发生。

2.跨线程的应用、线程的停止

        首先引入一个问题,为什么跨线程。UI线程称为主线程也就说在你运行代码后的那个窗体上的操作都是主线程,而代码中由点击事件启动的线程也叫子线程。现在我如果直接在点击事件中启动线程并对Label2进行修改,那么将会报一个错误叫做“跨线程操作”,这时候就是子线程在对主线程进行操作,存在不安全问题。那么解决这个问题就是用"Invoke"进行跨线程操作。

        在跨线程操作前需要进行一个判断,if里判断就是是否进行了跨线程操做,true则是是说明可能存在安全问题,反正则没有进行跨线程操作。这时候再使用"Invoke"对Label2进行修改就不会报错。值得一提的是,如果在主线程中写入while或者for等长时间循环的语句会导致窗体卡死,也叫做主线程阻塞。在使用"Invoke"后代表下面的代码已经进入了主线程操作,最好不要进行能够对主线程进行阻塞的操作。

        最后是关闭线程,"Abort"则是让正在运行的线程关闭。

3.让线程进入等待状态

        首先是实例化让线程进入等待状态的类并给予初始状态false。然后给定两个方法分别对应两个进程,一个是A从0加到9999,一个是B从10000减到1。因为使用的子线程修改主线程的操作,所以这里同点2一样需要执行跨线程操作。

        第一个点击事件是“启动线程”,是实例化两个线程并启动,在实例化线程的时候让线程进入等待状态加入,就是.WaitOne(),接着调用跨线程的方法来改变两个label的文本。第二个点击事件“开闸”,就是让线程退出等待状态,这时候第一个线程退出等待状态后再按下“开闸”第二个线程才会退出等待状态。最后停止是结束两个进程。示例如下:

        以上就是本次日志的全部内容。

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值