BLUE.NET

-------- 众里寻她千百度

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

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("响铃时间到!!!");
                    }

                }
            }
        }

    }
}

posted on 2009-03-13 13:22  blue.net  阅读(319)  评论(0)    收藏  举报