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 ...
随机推荐
- mysql手动设置数据表的自增值
设置表tablename的自增值从1开始自增值 alter table tablename auto_increment=1;
- each的break
$.each var arr = [1, 2, 'test', 3, 4, 5, 6] // break $.each(arr, function(index, value) { if (value ...
- 矩阵快速幂 51nod
基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出 ...
- rest-framework之频率控制
rest-framework之频率控制 本文目录 一 频率简介 二 自定义频率类,自定义频率规则 三 内置频率类及局部使用 四 内置频率类及全局使用 五 源码分析 回到目录 一 频率简介 为了控制用户 ...
- 12 IO流
File类:构造方法 * File(String pathname):根据一个路径得到File对象 * File(String parent, String child):根据一个目录和一 ...
- Js 分别取一个数的百位,十位,个位
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- zabbix监控mysql最简单的方法
该实验基于我的上一篇文章监控第一台主机的基础上 首先,因为水平有限,我选择直接关闭了防火墙和SELinux. 环境: 两台centos7,服务器端IP是192.168.200.128(以下简称主机), ...
- sofa graphql 2 rest api 试用
大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...
- JSON字符串互相转换的三种方式和性能比较
C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...
- 无损压缩PNG工具
http://nullice.com/archives/1998 http://nullice.com/archives/1998 http://nullice.com/limitPNG/ https ...