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 ...
随机推荐
- 【翻译】Context should go away for Go 2
2017/08/06 每次blog.golang.org更新博客,我都迫不及待去读一下:最新的一篇, Contributors Summit,记录了Go贡献者们的一些讨论.我读到一句话,让我感觉得 ...
- Python之路,第二十篇:Python入门与基础20
python3 面向对象4 supper 函数 supper(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例) supper() 返回绑定的超类的实例,等同于(cl ...
- poj 2253——Frogger
这个题一开始不知道咋做,但是大致有点意思.后来还是借鉴了题解发现可以用dijkstra,不太理解.但是在最后自己推的时候突然理解了. dijkstra应该也算是动态规划.我们用dis[i]数组作为青蛙 ...
- 如何更改Apache的根目录指向
更改Apache的默认网站根目录地址方法如下: 0,先找到主目录下的apache文件,然后进行下面操作 1.找到 DocumentRoot “X:/Apache/htdocs” 将“X:/Apache ...
- loadrunner如何对mysql进行增删改查
libraries.zip 地址:链接:https://pan.baidu.com/s/1kIZ2aBCOFSJ9l727MxgIKQ 密码:40vq * 说明一下,因为 lr 有很多库文件都没 ...
- HDU 1873 看病要排队 优先队列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- Blender模拟全局照明的简单方法
https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Faked_Gi_with_Blender_internal模拟全局照明最简单的方法是在我们 ...
- 03 重定向,请求转发,cookie,session
重定向: /* 之前的写法 response.setStatus(302); response.setHeader("Location", "login_success. ...
- 10 HashMap,Map.Entry,LinkedHashMap,TreeMap,Hashtable,Collections类
Map集合的功能概述 添加功能 * V put(K key,V value):添加元素. * 如果键是第一次存储,就直接存储元素,返回null * 如果键不 ...
- Java 源码解析
Object equals方法对比两个对象是否是内存中同一个物理地址 hashCode规定,当两个对象相等时,必须返回相等的hashCode,所以重写equals方法有必要重写hashCode方法 如 ...