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. iOS 静态库代码混淆方案

    基于开源 Obfuscator-LLVM方案 下载安装最新版本 Obfuscator-LLVM,目前3.6.1 $ git clone -b llvm-3.6.1 https://github.com ...

  2. php腾讯面试题(转)

    一.PHP开发部分 1.合并两个数组有几种方式,试比较它们的异同 答:1.array_merge() 2.’+’ 3.array_merge_recursive array_merge 简单的合并数组 ...

  3. Linux命令学习之路——档案拷贝:cp

    使用权限:所有角色 使用方式:cp [ -arf ] source dest / cp [ -arf ] source... Directory 作用:把一个档案拷贝到另一个档案(档案复制),或将多个 ...

  4. sudo操作

    在非root权限下,无法执行 vim /etc/profile 并保存,提示如下错误: "profile" E212: Can't open file for writing Pr ...

  5. .net core consul grpc--系统服务RPC实现通信(一)

    .net core grpc 系统服务实现通信(一) 现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/ ...

  6. java实现各种排序算法

    java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...

  7. 实验吧—Web——WP之 FALSE

    打开链接,点击源码按钮,我们开始分析源码: 在这源码中我们能看出 如果名字等于密码就输出:你的名字不能等于密码 如果名字的哈希值等于密码的哈希值,那么就会输出flag 这就意味着我们要上传两个值,值不 ...

  8. while与do/while循环

    while循环1.格式:初始化条件while(循环条件){循环体迭代条件}题目:100以内偶数的输出及其和(while语句) public class V{ public static void ma ...

  9. LG4071 [SDOI2016]排列计数

    题意 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 ...

  10. Android 工具视频学习笔记_WDS

    1. 由于Android源码过于庞大,SourceInsight会经常卡死,不适合了.适合的是Android Studio, 非常好用.使用手册上有介绍如何安装. 编译安卓的过程说明手册中也有. 3. ...