ManualResetEvent学习实例
ManualResetEvent为多个线程之间提供了一个共享的信号。
初始化:ManualResetEvent mre=new ManualResetEvent(true)
初始值为true表示有信号,为false表示无信号
使用:mre.Set()将有信号的消息通知到各线程
mre.Reset()将无信号的消息通知到各线程
线程内使用是通过mre.WaitOne()来进行获取信号的:
有信号时(Set,或true)线程中此语句之后的代码可以继续执行;
无信号时(Reset,或false)线程中此语句之后的代码将被阻塞。
我做了一个实例,用来演示ManualResetEvent的用法。
主界面有四个进度条,表示四台机器,其中三台电动机,一台柴油机;
设置了一个ManualResetEvent信号,表示power电力,有电时,电动机才能
运转,柴油机则不受power信号的影响。
初始时,power有信号,点击START按钮,四台机器一起运转,
当点击关闭电源时,所有电动机停止,柴油机继续运转
当点击接通电源时,电动机和柴油机都会运行了!
PS:三台电动机特意设置了不同速度。

public partial class Form1 : Form
{
ManualResetEvent power = new ManualResetEvent(true); Thread tDieselEngine;
Thread tElectricMotor1, tElectricMotor2, tElectricMotor3;
public Form1()
{
InitializeComponent(); //electric motor
progressBar1.Minimum = ;
progressBar1.Maximum = ;
progressBar1.Value = ;
progressBar1.Tag = ;//周期 //electric motor
progressBar2.Minimum = ;
progressBar2.Maximum = ;
progressBar2.Value = ;
progressBar2.Tag = ;//周期 //diesel engine
progressBar3.Minimum = ;
progressBar3.Maximum = ;
progressBar3.Value = ; //electric motor
progressBar4.Minimum = ;
progressBar4.Maximum = ;
progressBar4.Value = ;
progressBar4.Tag = ;//周期 tDieselEngine =new Thread(DieselEngineFun);
tElectricMotor1 = new Thread(new ParameterizedThreadStart(ElectricMotorFun));
tElectricMotor2 = new Thread(new ParameterizedThreadStart(ElectricMotorFun));
tElectricMotor3 = new Thread(new ParameterizedThreadStart(ElectricMotorFun));
} void DieselEngineFun()
{
while (true)
{
//power.WaitOne();
Invoke(new Action<ProgressBar>((pb) => pb.Value = (pb.Value + ) % pb.Maximum), progressBar3);
Thread.Sleep();
}
} void ElectricMotorFun(object opb)
{
ProgressBar epb = opb as ProgressBar;
int rate = (int)epb.Tag;
while (true)
{
power.WaitOne();//会在此等待电源
Invoke(new Action<ProgressBar>((pb) => pb.Value = (pb.Value + ) % pb.Maximum), epb);
Thread.Sleep(rate);
}
} private void btnStart_Click(object sender, EventArgs e)
{
tDieselEngine.Start();
tElectricMotor1.Start(progressBar1);
tElectricMotor2.Start(progressBar2);
tElectricMotor3.Start(progressBar4);
} private void btnReset_Click(object sender, EventArgs e)
{
power.Reset();
} private void btnSet_Click(object sender, EventArgs e)
{
power.Set();
} private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
tDieselEngine.Abort();
tElectricMotor1.Abort();
tElectricMotor2.Abort();
tElectricMotor3.Abort();
}
}
ManualResetEvent学习实例的更多相关文章
- Ant学习实例
ant 目录(?)[+] Ant学习实例 安装Ant 基础元素 project元素 target元素 property元素 完整示例 Ant学习实例 1.安装Ant 先从http://ant. ...
- zTree学习实例
今天做完一个zTree的实例,供有需要的学习! 效果图如下:
- (转)jQuery插件编写学习+实例——无限滚动
原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...
- jQuery插件编写学习+实例——无限滚动
最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简单学习了下jQuery的插件编写,然后分享出来. 先说下基础知识,基本上分为两种,一种是对象级别的插 ...
- WCF通信简单学习实例
最近在学习WCF通信,自己简单做个实例分享一下,环境是VS2015,使用的项目都是WPF的项目,其实大家用Winform或者Web项目也可以,都可以用的. 一.服务器端 1.创建WCF服务 服务名为W ...
- 关于ManualResetEvent的实例分析
最近用WPF开发时使用多个定时器处理时需要实例化N多个DispatcherTimer,而且全部暴露在程序外部,显得很冗杂,例如下面的例子:用到的两个定时器就要实例化两个DispatcherTimer, ...
- React入门最好的学习实例-TodoList
前言 React 的核心思想是:封装组件,各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件. 最近前端界闹的沸沸扬扬的技术当属react了,加上项目需要等等原因,自己也决定花些时间来好 ...
- Spring Security3学习实例
Spring Security是什么? Spring Security,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理 ...
- gulp入门学习实例
好久都没有更新博客了,每天繁忙的工作,下班之后都不想开设备了.前段时间有幸学习了一下gulp这款构建工具,现在和大家分享一下. 为什么使用Gulp Gulp基于Node.js的前端构建工具,通过Gul ...
随机推荐
- gl_PointSize偶数像素表现精准,基数会模糊化。
- [LeetCode&Python] Problem 598. Range Addition II
Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...
- 20155219 2016-2017-2 《Java程序设计》第7周学习总结
20155219 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为 ...
- 51Nod 1070:Bash游戏 V4(斐波那契博弈)
1070 Bash游戏 V4 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个 ...
- 字符串转json格式
方法一:var json = JSON.parse(str)方法二:eval
- 微信导出群记录V2.0
作业链接:[https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1245] 一.序 啊,忘了作业!作业内容是将东北师范大学2017级软件工 ...
- django 有关session内部函数做法
session在set和调用时其实分别做了三步: def fileupload(request): request.session['k1'] = 'ppp' ''' .生成一个随机字符串 .set_ ...
- hdu3613 Best Reward manacher+贪心+前缀和
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- hdu1875 畅通工程再续 并查集/最小生成树
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...
- 转:《Javascript模块化编程》
(一):模块的写法 转载至:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html (二):AMD规范 转载至:http://www ...