2010-05-24 81 views
1

新手在這裏。我有這樣的代碼:暫停執行並運行,直到表單被點擊

while (v < 360) 
{ 
    v +=10; 
    RunIt(); 
    // need to wait half a second here 
} 

如何等待1/2秒?另外,如果這不要求太多,我希望這個重複運行,直到用戶點擊表單。提前致謝。

+1

你想要什麼反覆運行,直到用戶單擊表單? – 2010-05-24 18:11:12

+0

實際上,當v達到360時,v被重置爲0,所以我沒有很好地說明問題。我希望這個代碼用它自己的小方法繼續運行,直到用戶單擊表單或按下一個鍵。 – jimmy 2010-05-24 18:28:15

+0

RunIt()做什麼? – 2010-05-24 18:36:30

回答

2

如果你想do等你半秒鐘可以加

Thread.Sleep(500); 
+0

謝謝!很簡單,我想,但我仍然在學習這些東西。這解決了這個問題,但我仍然有重複這個問題,直到用戶點擊表單。有什麼建議麼?我嘗試過使用表單的單擊事件,但這使得C#真的很瘋狂。擊鍵會一樣好。 – jimmy 2010-05-24 18:19:41

2

您可以使用Thread.Sleep

while (v < 360) 
{ 
    v +=10; 
    RunIt(); 
    // wait half a second here 
    Thread.Sleep(500); 

}

1

在Windows窗體應用程序,你可以等待的時間量與此:

System.Threading.Thread.Sleep(500); // Waits for 1/2 second. 
1

好吧,所以我剛剛嘗試使用Thread.Sleep(500)方法,它似乎沒有做什麼吉米最初要求。也許我做錯了,但它似乎阻止線程並導致窗體被鎖定,因此用戶不能點擊任何窗體按鈕或其他任何東西。最後,Windows將窗體顯示爲未響應。

由於目標是運行,直到用戶單擊窗體(或在窗體上的特定控件上),那麼我認爲前進的方向是使用計時器對象。以下是我將使用的實現示例。我有一個標準的表格,並添加了一個按鈕和一個標籤。標籤顯示v的值並每隔半秒更新一次,直到用戶單擊該按鈕。當按鈕被點擊時,按鈕的事件處理程序停止計時器,從而停止調用RunIt()。

不需要「使用System.Threading;」因爲我們使用的是System.Windows.Forms.Timer。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     runItTimer.Interval = 500; 
     runItTimer.Tick += new EventHandler(runItTimer_Tick); 
     runItTimer.Start(); 
    } 

    private System.Windows.Forms.Timer runItTimer = new System.Windows.Forms.Timer(); 

    private int v = 0; 

    void runItTimer_Tick(object sender, EventArgs e) 
    { 
     v += 10; 
     RunIt(); 
     if (v == 360) { v = 0; } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     runItTimer.Stop(); 
    } 

    private void RunIt() 
    { 
     label1.Text = v.ToString(); 
     Refresh(); 
    } 
} 
0

你得到了第一部分的問題,Thread.Sleep。

至於第二部分,你應該熟悉winforms是如何工作的。每個UI線程都有自己的消息隊列。然後將消息發送到處理它們的適當格式。消息可以指示表單必須自己繪製,按下了一個鍵等等。處理這個隊列和你的代碼在同一個線程中,所以如果你有一個無限循環,那麼你將阻塞消息隊列,並且不能處理新的消息。這意味着表單不會響應任何事件。要解決這個問題,你必須選擇。一種是在後臺線程上運行RunIt方法,另一種是強制處理消息隊列。前一種方法可能會更好,但開始時可以嘗試後者。您可以使用Application.DoEvents方法強制處理消息隊列。

while (v < 360) 
{ 
    v +=10; 
    RunIt(); 
    Thread.Sleep(500); 
    // Enable message queue to process events. 
    Application.DoEvents(); 
} 

這裏有一些事情閱讀:

+0

感謝所有回覆的人。 Patko,你的建議絕對會給我一些東西來咀嚼。 Application.DoEvents看起來很有希望。我會閱讀那篇文章。 – jimmy 2010-05-24 20:35:24

+0

Application.DoEvents()做了訣竅。謝謝! – jimmy 2010-05-25 10:19:04

0

這裏是我的代碼修改後的版本,它使用Application.DoEvents的Patko的建議()。請注意,從構造函數中啓動while循環可以阻止窗體在屏幕上顯示。爲了解決這個問題,我從Form1_Shown事件開始了while循環。有其他方法可以解決這個問題。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     //RunMeTillSomeoneClicks(); // !!! Stops the form from being shown. 
    } 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     RunMeTillSomeoneClicks(); 
    } 

    private bool keepOnRunning = true; 

    private void RunMeTillSomeoneClicks() 
    { 
     int v = 0; 
     while (keepOnRunning && (v < 360)) 
     { 
      v += 10; 
      RunIt(v); 
      System.Threading.Thread.Sleep(500); 
      if (v == 360) { v = 0; } 
      Application.DoEvents(); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     keepOnRunning = false; 
    } 

    private void RunIt(int v) 
    { 
     label1.Text = v.ToString(); 
     Refresh(); 
    } 
}