using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//使用线程时要引用命名空间System.Threading;
using System.Threading;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 在窗体进行载入的时候,开始新建线程对象th
/// 将线程设为后台执行
/// 然后开始执行线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//新建线程对象th,th将委托show方法,show方法起到循环执行la()方法的作用
Thread th = new Thread(new ThreadStart(show));
//将th线程设置为后台线程
th.IsBackground = true;
//线程开始执行
th.Start();
}
public void show()
{
//开始执行la()方法,第一次将会使用线程在主线程内实例化label1并设置属性
la();
//使用while循环来不停的循环执行la()方法
while (true)
{
//循环中的la()方法
la();
//线程暂停一秒钟,这个很重要,如果没有他,整个窗体都会没有响应
//因为,没有等待的一秒钟程序会不停的使用la()方法,使窗口没响应
Thread.Sleep(1000);
}
}
//要使用Invoke就一定要用到delegate委托对象,所以要事先新建delegate对象delegate1
public delegate void delegate1();
//如果线程中使用哪个控件,就要新建哪个控件,如label1对象是新建的,但一定不要实例化(重要)
public Label label1;
//如果用到时间对象,那么还要新建时间控件,如上行代码一样不需要进行实例化
public DateTime dt;
/// <summary>
/// 重要的la方法,在线程中对窗口操作的代码都在这里
/// 下面的代码的作用是:它可以让工作线程的中委托在主线程中执行!
/// 看到下面的委托了吗?他是在委托自身,所以la()方法中的委托是自身的方法
/// 也就是说la()方法中的一部分内容可以在主线程中执行
/// if (InvokeRequired)
/// {
///
/// this.Invoke(new delegate1(la));
/// }
/// 下面的方法就是可以在主线程中执行的方法
/// 由于show()方法对la()方法调用是循环调用的,
/// 所以不能每次循环都新建一个对象,所以我在下面做了一个判断
/// 只有在对象为空的时候才可以实例化对象,也就是说,label1对象只能被实例化一次
///else
///{
/// if (label1 == null)
/// {
/// label1 = new Label();
/// label1.AutoSize = true;
/// label1.Top = 100;
/// label1.Left = 100;
/// Controls.Add(label1);
/// }
/// else
/// {
/// dt = DateTime.Now;
/// label1.Text = dt.Hour + "点" + dt.Minute + "分" + dt.Second + "秒";
/// if (dt.Hour == 19 && dt.Minute == 30 && dt.Second == 5)
/// {
/// MessageBox.Show("响铃时间到!!!");
/// }
/// }
///}
///
/// </summary>
public void la()
{
//使用InvokeRequired方法来判断当前情况下需不需要使用Invoke方法,
//如果已经使用过Invoke方法,就不会再使用Invoke方法了
if (InvokeRequired)
{
//这一句很重要,Invvoke方法中的委托,就是要在主线程中执行的委托
this.Invoke(new delegate1(la));
}
else
{
//判断label1对象是否为空,如果为空,那么执行下面的代码
//大体的意思也就是说,label1有没有进行过实例化,如果没有进行过实例化
//那么执行下面的代码
if (label1 == null)
{
//实例化label1对象
label1 = new Label();
//设置label1对象属性为自动调整大小
label1.AutoSize = true;
//设置label1的高度
label1.Top = 100;
//设置label1的左右位置
label1.Left = 100;
//向主窗体中添加label1对象
Controls.Add(label1);
}
else
{
//对时间对象进行实例化
dt = DateTime.Now;
//label1.text=现在的时间
label1.Text = dt.Hour + "点" + dt.Minute + "分" + dt.Second + "秒";
//如果现在的时间是19时30分5秒,则显示提示窗口
if (dt.Hour == 19 && dt.Minute == 30 && dt.Second == 5)
{
MessageBox.Show("响铃时间到!!!");
}
}
}
}
}
}