2016-05-12 7 views
-2

Ich versuche ein Programm zu erstellen, das den Computer nach der eingegebenen Zeit (Stunden, Minuten und Sekunden) herunterfährt. Alles funktioniert, außer dass richTextBox1 überhaupt nicht aktualisiert wird. Bitte könnte jemand mit diesem Problem helfen. Danke im Voraus.Ich kann keine RichTextBox1 zum Aktualisieren erhalten

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

namespace ShutdownPC 
{ 
    public partial class Form1 : Form 
    { 
     public int inputHours = 0; 
     public int inputMinutes = 0; 
     public int inputSeconds = 0; 
     public int totalSeconds = 0; 
     public int totalMilliseconds = 0; 
     public int ticks = 0; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      textBox1.Enabled = false; 
      textBox2.Enabled = false; 
      textBox3.Enabled = false; 
      button1.Enabled = false; 

      // Hours 
      if (!string.IsNullOrWhiteSpace(textBox1.Text)) 
      { 
       inputHours = int.Parse(textBox1.Text); 
      } 

      // Minutes 
      if (!string.IsNullOrWhiteSpace(textBox2.Text)) 
      { 
       inputMinutes = int.Parse(textBox2.Text); 
      } 

      // Seconds 
      if (!string.IsNullOrWhiteSpace(textBox3.Text)) 
      { 
       inputSeconds = int.Parse(textBox3.Text); 
      } 

      // Updating richTextBox1 every second with remaining time left 
      totalSeconds = (inputHours * 3600) + (inputMinutes * 60) + inputSeconds; 
      timer1.Start(); 
      while (ticks < totalSeconds) 
      { 
       TimeSpan time = TimeSpan.FromSeconds(totalSeconds); 

       string timeOutput = time.ToString(@"hh\:mm\:ss"); 

       richTextBox1.AppendText(String.Format(timeOutput)); 
       Thread.Sleep(1000); 
       richTextBox1.Clear(); 
      } 


      // Shutting down computer 
      totalMilliseconds = ((inputHours * 3600) + (inputMinutes * 60) + inputSeconds) * 1000; 
      Thread.Sleep(totalMilliseconds); 
      richTextBox1.AppendText("end"); 
      //Process.Start("shutdown", "/s /t 0"); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      ticks++; 
     } 
    } 
} 
+1

Blockieren Sie den UI-Thread nicht. – SLaks

+0

Wann würden Sie den neuen Text erwarten? Direkt nach dem Schlaf, ja ?? das ist wenn??? Hast du der rzb Zeit zum Auffrischen gegeben? Oder erzwinge es? – TaW

+0

BTW: Wenn Sie den UI-Thread blockieren, blockieren Sie nicht nur die Aktualisierung der Benutzeroberfläche, Sie blockieren auch den System.Windows.Forms.Timer :) – Eser

Antwort

1

Wie SLaks gesagt, wenn Sie die Benutzeroberfläche der Box Thread-Block wird nie aktualisiert werden, aber in .net haben Sie/Asynchron erwarten, wandeln nur Ihre Methode private async void button1_Click und statt Thread.Sleep Verwendung await Task.Delay.

auch sicher, dass Sie die Box Inhalt mit

TimeSpan time = TimeSpan.FromSeconds(totalSeconds); 
richTextBox1.AppendText(String.Format(timeOutput)); 

Diese

TimeSpan time = TimeSpan.FromSeconds(totalSeconds - ticks);  
richTextBox1.AppendText(String.Format(timeOutput)); 

sein sollte Wenn Sie ein Count-Down möchten.

+0

Dies hat nicht funktioniert :( – Conor

+0

@Conor Ich hasse diese Art von Kommentaren, Was bedeutet 'Das hat nicht funktioniert 'bedeutet? Kompilieren Sie Zeit Fehler? Alle Ausnahmen? Wie haben Sie diesen Code verwendet? – Eser

+0

Schauen Sie auf mein Update, und andere Zeit sagen, was ist * funktioniert nicht *;) – Gusman

Verwandte Themen