DateTime类作为秒表

Man*_*čić -1 c# datetime

我的学校项目是用一个按钮启动/停止来开始计算时间,然后再点击停止计算时间.当我使用这3行

txtVrijeme.Text = Convert.ToString(sada.AddSeconds(i).ToString("HH:mm:ss"));
Thread.Sleep(1000);
i++;
Run Code Online (Sandbox Code Playgroud)

在形式apk中没有循环(while,for,goto等).它工作(显示00:00:00,如果我再次点击00:00:01)但是当我使用循环它不显示任何东西.为什么?顺便说一句.控制台应用程序使用此代码没有任何问题(在控制台中循环)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Bradi?i?ManuelŠtoperica
{
    public partial class Form1 : Form
    {
        DateTime sada = new DateTime(2009, 6, 22, 0, 0, 0);
        int i = 0;
        bool x = true;

        public Form1()
        {
            InitializeComponent();                
        }

        void execute(bool y)
        {

            while (y == true)
             {
                txtVrijeme.Text = Convert.ToString(sada.AddSeconds(i).ToString("HH:mm:ss"));
                Thread.Sleep(1000);
                i++;
            }
        }


        private void btnStartStop_Click(object sender, EventArgs e)
        {      
            if (x == false)
                  x = true;    
            else
                  x = false;

            execute(x);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {    
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

原谅我的英文:)

Joe*_*orn 5

更改文本框属性不会直接向屏幕绘制任何内容.

再说一遍:

更改文本框属性不会直接向屏幕绘制任何内容.

发生什么是Textbox控件将使其图形区域无效,这将导致生成WM_PAINT消息.

程序需要在更新屏幕之前处理此WM_PAINT消息.接收和处理您的油漆事件的线程是同一个线程在您的execute()方式运行.它也是处理您的方法的相同线程btnStartStop_Click().

不幸的是,该execute()方法永远不会完成.它永远不会允许该线程上的执行回退到程序的主消息循环,因此您的程序无法重新绘制文本框,并且它无法处理最终可能使execute()方法停止的按钮单击.即使它暂停,也会使整个线程进入睡眠状态.

你需要做的是使用一个Timer组件,并处理Timer的Tick事件.

此外,计时器事件并不完全精确.每个Tick事件的轻微差异可以随着时间的推移而累加,因此,不是为每个事件递增当前值,而是程序应该记住开始时间并计算与当前时间的差异.