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学习实例的更多相关文章

  1. Ant学习实例

    ant   目录(?)[+] Ant学习实例 安装Ant 基础元素 project元素 target元素 property元素 完整示例   Ant学习实例 1.安装Ant 先从http://ant. ...

  2. zTree学习实例

    今天做完一个zTree的实例,供有需要的学习! 效果图如下:

  3. (转)jQuery插件编写学习+实例——无限滚动

    原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...

  4. jQuery插件编写学习+实例——无限滚动

    最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简单学习了下jQuery的插件编写,然后分享出来. 先说下基础知识,基本上分为两种,一种是对象级别的插 ...

  5. WCF通信简单学习实例

    最近在学习WCF通信,自己简单做个实例分享一下,环境是VS2015,使用的项目都是WPF的项目,其实大家用Winform或者Web项目也可以,都可以用的. 一.服务器端 1.创建WCF服务 服务名为W ...

  6. 关于ManualResetEvent的实例分析

    最近用WPF开发时使用多个定时器处理时需要实例化N多个DispatcherTimer,而且全部暴露在程序外部,显得很冗杂,例如下面的例子:用到的两个定时器就要实例化两个DispatcherTimer, ...

  7. React入门最好的学习实例-TodoList

    前言 React 的核心思想是:封装组件,各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件. 最近前端界闹的沸沸扬扬的技术当属react了,加上项目需要等等原因,自己也决定花些时间来好 ...

  8. Spring Security3学习实例

    Spring Security是什么? Spring Security,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理 ...

  9. gulp入门学习实例

    好久都没有更新博客了,每天繁忙的工作,下班之后都不想开设备了.前段时间有幸学习了一下gulp这款构建工具,现在和大家分享一下. 为什么使用Gulp Gulp基于Node.js的前端构建工具,通过Gul ...

随机推荐

  1. gl_PointSize偶数像素表现精准,基数会模糊化。

  2. [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 ...

  3. 20155219 2016-2017-2 《Java程序设计》第7周学习总结

    20155219 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为 ...

  4. 51Nod 1070:Bash游戏 V4(斐波那契博弈)

    1070 Bash游戏 V4  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个 ...

  5. 字符串转json格式

    方法一:var json = JSON.parse(str)方法二:eval

  6. 微信导出群记录V2.0

    作业链接:[https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1245] 一.序 啊,忘了作业!作业内容是将东北师范大学2017级软件工 ...

  7. django 有关session内部函数做法

    session在set和调用时其实分别做了三步: def fileupload(request): request.session['k1'] = 'ppp' ''' .生成一个随机字符串 .set_ ...

  8. hdu3613 Best Reward manacher+贪心+前缀和

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  9. hdu1875 畅通工程再续 并查集/最小生成树

    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...

  10. 转:《Javascript模块化编程》

    (一):模块的写法 转载至:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html (二):AMD规范 转载至:http://www ...