2014-11-01 189 views
1

我在C#上的GUI上制作数字时钟。我有5个按钮,4个用于时区转换,另一个用于关闭表格。C#按钮暂停

我的问题是,当我按下按钮一(从我的系统时间转换中央时间),它会在标签框中闪烁约1秒钟的时间并恢复到我目前的系统时间。

在控制台我知道有一个暂停执行暂停程序。如何使用暂停按住该设置上的中央时间按钮,但保持定时器运行?我很乐意使用多种形式。

这里是我的按钮代码:

private void Central_Click(object sender, EventArgs e) 
{ 
    hr = DateTime.Now.Hour; 
    hr = DateTime.Now.Hour - 1; 
    min = DateTime.Now.Minute; 
    sec = DateTime.Now.Second; 

    if (hr > 12) 
     hr -= 12; 

    if (sec % 2 == 0) 
    { 
     time.Text = hr + ":" + min + ":" + sec; 
    } 
    else 
    { 
     time.Text = hr + " " + min + " " + sec; 
    } 
} 
+0

所以你想要你的程序睡几秒钟来显示你的数据,然后继续代码? – 2014-11-01 03:46:31

回答

0

如果我理解正确的话,也许这样的事情会为你工作:

private void Central_Click(object sender, EventArgs e) 
{ 
    // Here you could disable all the buttons 

    // endTime defines how long we will show this time zone (5 seconds) 
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5)); 

    while (DateTime.Now < endTime) 
    { 
     // Show the short time format (hh:mm:ss AM|PM) 
     var displayText = DateTime.Now.Subtract(TimeSpan.FromHours(1)).ToString("T"); 

     if ((DateTime.Now.Second % 2 == 1)) 
     { 
      // Every other second, hide the colons 
      displayText = displayText.Replace(":", " "); 
     } 

     time.Text = displayText; 

     // Sleep for one second 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 

    // And here you can enable the buttons again 
} 

另一个要注意的是,有建在转换到另一个时区的方法。基本上,你得到的UTC(通用)的时间,然后将其转换到你感兴趣的时区上面的代码可以转换到使用这个像这样:

private void Central_Click(object sender, EventArgs e) 
{ 
    // endTime defines how long we will show this time zone (5 seconds) 
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5)); 

    while (DateTime.Now < endTime) 
    { 
     // Get UTC time 
     DateTime utcTime = DateTime.UtcNow; 

     // Convert it to Central Time 
     var displayText = TimeZoneInfo.ConvertTimeFromUtc(utcTime, 
      TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")) 
      .ToString("T"); 

     if ((DateTime.Now.Second % 2 == 1)) 
     { 
      // Every other second, hide the colons 
      displayText = displayText.Replace(":", " "); 
     } 

     time.Text = displayText; 

     // Sleep for one second 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
} 
0

你的问题是相当不明确。但我想你只是简单地制作一个定时时钟。为此,您需要做的是使时区设置持续。所以,你需要他们在一个类级别的变量或两个,也许是这样的:

TimeSpan correction = new TimeSpan(0); 
string zone = "ET"; 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    // display the corrected time with its name 
    time.Text = (DateTime.Now + correction).ToString("h:mm:ss ") + zone; 
} 

private void Central_Click(object sender, EventArgs e) 
{ 
    correction = new TimeSpan(-1, 0, 0); // set the hours of the new zone 
    zone = "CT";       // set its name 
} 

我希望你的计时器有一个更好的名字,就像你使用其他名称。(虽然我总是包括前缀显示我的控件的类型。)

也请看一看预定义的日期和时间格式,其中很多会根据你的机器的本地化工作的侦探:

Standard Date&Time patterns

Long time pattern

如果我不明白'暂停'是什么意思,请澄清!如果你可能不想真的切换到一个新的时区,但只是短时间显示它的时间,你只需要添加3或4行..:

一个新的变量来保存时间还没有保持区域:在点击将其设置为几秒钟

int secondsToHold = 0; 

一号线,在这里我莒南县3秒:

secondsToHold = (int) (3 * 1000f /timer1.Interval); 

终于在Tick事件代码来检查并重置varaibles:

if (secondsToHold > 0) secondsToHold -= 1; 
else { correction = new TimeSpan(0); zone = "ET"; }