我的学校项目是用一个按钮启动/停止来开始计算时间,然后再点击停止计算时间.当我使用这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)
原谅我的英文:)
更改文本框属性不会直接向屏幕绘制任何内容.
再说一遍:
更改文本框属性不会直接向屏幕绘制任何内容.
发生什么是Textbox控件将使其图形区域无效,这将导致生成WM_PAINT消息.
程序需要在更新屏幕之前处理此WM_PAINT消息.接收和处理您的油漆事件的线程是同一个线程在您的execute()方式运行.它也是处理您的方法的相同线程btnStartStop_Click().
不幸的是,该execute()方法永远不会完成.它永远不会允许该线程上的执行回退到程序的主消息循环,因此您的程序无法重新绘制文本框,并且它无法处理最终可能使execute()方法停止的按钮单击.即使它暂停,也会使整个线程进入睡眠状态.
你需要做的是使用一个Timer组件,并处理Timer的Tick事件.
此外,计时器事件并不完全精确.每个Tick事件的轻微差异可以随着时间的推移而累加,因此,不是为每个事件递增当前值,而是程序应该记住开始时间并计算与当前时间的差异.