用线程实现C#中的倒计时

      考试的时候,会有一个倒计时的实现。一般我们会选择使用Timer控件来实现,几句代码就可以简单的实现了。从网上找到一种方法可以通过进程睡觉来实现倒计时。感兴趣的可以研究一下,下面的两种方法:


一、普通Timer控件实现倒计时:


     假设倒计时60分钟,如图一个label记录总的倒计时时间。





     插入一个timer控件,在timer1_Tick事件中进行编写。


   private void timer1_Tick(object sender, EventArgs e)
        {
            //倒计时
            if (Timecount >= 0)
            {
                this.lbltime.Text = ((Timecount / 60000) % 60).ToString();

                Timecount -= 1000;
            }
            if (Timecount == 0)
            {
                //强制交卷的代码
                MessageBox.Show("考试时间到");
                this.Close();
            }
        }


二、进程实现倒计时:


      前面用几个label显示数据,一个开始按钮,一个结束按钮。


用线程实现C#中的倒计时_第1张图片


后台是这样编写的:


 public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        int Timecount = 0;//记录倒计时总毫秒数
        int isstop = 0;//标示是否启动/暂停的变量,0表示第一次初始化
        private void button1_Click(object sender, EventArgs e)
        {
            if (this.button1.Text == "开始计时" || this.button1.Text == "继续计时")
            {
                this.button1.Text = "暂停计时";
                if (isstop == 0)//第一次执行或者倒计时事件设置发生变化,则重新倒计时
                {
                    Timecount = Convert.ToInt32(txtTotalmm.Text) * 60000;//毫秒
                    MessageBox.Show(Timecount.ToString());
                    Thread counter = new Thread(Counter);
                    counter.Start();
                    Control.CheckForIllegalCrossThreadCalls = false;//放弃捕获对错误线程的调用,否则在线程中无法调用控件名  
                }
                isstop = 1;//启动
            }
            else
            {
                this.button1.Text = "继续计时";
                isstop = 2;//暂停
            }
        }
        public void Counter()
        {
        
                while (Timecount >= 0)
                {
                    this.txthour.Text = (Timecount / 60/60/100).ToString();
                    this.txtmm.Text = ((Timecount / 60/1000) % 60).ToString();
                    this.txtss.Text = ((Timecount / 1000) % 60).ToString();
                    this.txtmss.Text = (Timecount % 1000).ToString();
                    //label1.Text = hour.ToString() + "时 " + minute.ToString() + "分 " + second.ToString() + "秒" + millsecond + "毫秒";
                    if (Timecount == 0)
                    {
                        this.button1.Text = "开始计时";
                        isstop = 0;
                      
                            Thread currthread = Thread.CurrentThread;
                            currthread.Abort();// 终止当前进程,会触发ThreadAbortException异常,从而终止进程,所以下面需要捕获该异常才能终止进程

                    }
                    if (isstop != 2)
                        Timecount -= 1;
                    Thread.Sleep(1);
                }
        
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.txtTotalmm.Text = (Convert.ToInt32(this.txtTotalmm.Text) + 1).ToString();
        }

三、Thread类常用方法:

  • Thread.Suspend()  //挂起线程(使线程暂时停止) 
  • Thread.Resume()   //使挂起的线程开始工作 
  • Thread.Abort()    //使线程永远的停止 
  • Thread.Join()     //线程之间的插入  
  • Thread.Start()  //开始执行线程 

四、总结:



1.倒计时如果是以秒为单位,可以选择Timer和线程来实现,如果以毫秒为单位,建议使用线程来实现。

2.使用线程时,如果要暂停,需要使用Abort()方法终止线程,该方法是通过触发ThreadAbortException异常来实现对线程的终止的,所以需要捕获该异常,才能终止线程。


你可能感兴趣的:(1.NCRE考试系统)