using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsForms
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread Thread_T9; //除尘机通讯线程
ManualResetEvent _event = new ManualResetEvent(true);
private void button1_Click(object sender, EventArgs e)
{
//启动一个线程
//new Thread(ThreadProc).Start();
Thread_T9 = new Thread(ThreadProc);// (new ThreadStart(fSingleCameraProcess));
Thread_T9.Start(); //启动线程
Thread_T9.IsBackground = true;
}
//线程函数
public void ThreadProc()
{
while (true)
{
_event.WaitOne();
//this.Invoke就是跨线程访问ui的方法,也是本文的范例
//首先invoke一个匿名委托,将button对象禁用
this.Invoke((EventHandler)delegate
{
button1.Enabled = false;
});
//记录一个时间戳,以演示倒计时效果
int tick = Environment.TickCount;
while (Environment.TickCount - tick < 1000)
{
//跨线程调用更新窗体上控件的属性,这里是更新这个按钮对象的Text属性
this.Invoke((EventHandler)delegate
{
button1.Text = (1000 - Environment.TickCount + tick).ToString() + "微秒后开始更新";
});
//做一个延迟,避免太快了,视觉效果不好。
Thread.Sleep(100);
}
//演示,10次数字递增显示
for (int i = 0; i < 10; i++)
{
this.Invoke((EventHandler)delegate
{
button1.Text = i.ToString();
});
Thread.Sleep(200);
}
//虽然不是循环内,请不要忘记,你的调用依然在辅助线程中,所以,还是需要invoke的。
//还原状态,设置按钮的文本为初始状态,设置按钮可用。
this.Invoke((EventHandler)delegate
{
button1.Text = "点击开始测试";
button1.Enabled = true;
});
}
}
private void Form1_Load(object sender, EventArgs e)
{
/*
*/
this.button1.Click += new System.EventHandler(this.button1_Click);
}
private void button2_Click(object sender, EventArgs e)
{
_event.Set();
}
private void button3_Click(object sender, EventArgs e)
{
_event.Reset();
}
}
}