新手在這裏。我有這樣的代碼:暫停執行並運行,直到表單被點擊
while (v < 360)
{
v +=10;
RunIt();
// need to wait half a second here
}
如何等待1/2秒?另外,如果這不要求太多,我希望這個重複運行,直到用戶點擊表單。提前致謝。
新手在這裏。我有這樣的代碼:暫停執行並運行,直到表單被點擊
while (v < 360)
{
v +=10;
RunIt();
// need to wait half a second here
}
如何等待1/2秒?另外,如果這不要求太多,我希望這個重複運行,直到用戶點擊表單。提前致謝。
如果你想do等你半秒鐘可以加
Thread.Sleep(500);
謝謝!很簡單,我想,但我仍然在學習這些東西。這解決了這個問題,但我仍然有重複這個問題,直到用戶點擊表單。有什麼建議麼?我嘗試過使用表單的單擊事件,但這使得C#真的很瘋狂。擊鍵會一樣好。 – jimmy 2010-05-24 18:19:41
您可以使用Thread.Sleep
:
while (v < 360)
{
v +=10;
RunIt();
// wait half a second here
Thread.Sleep(500);
}
在Windows窗體應用程序,你可以等待的時間量與此:
System.Threading.Thread.Sleep(500); // Waits for 1/2 second.
好吧,所以我剛剛嘗試使用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();
}
}
你得到了第一部分的問題,Thread.Sleep。
至於第二部分,你應該熟悉winforms是如何工作的。每個UI線程都有自己的消息隊列。然後將消息發送到處理它們的適當格式。消息可以指示表單必須自己繪製,按下了一個鍵等等。處理這個隊列和你的代碼在同一個線程中,所以如果你有一個無限循環,那麼你將阻塞消息隊列,並且不能處理新的消息。這意味着表單不會響應任何事件。要解決這個問題,你必須選擇。一種是在後臺線程上運行RunIt方法,另一種是強制處理消息隊列。前一種方法可能會更好,但開始時可以嘗試後者。您可以使用Application.DoEvents方法強制處理消息隊列。
while (v < 360)
{
v +=10;
RunIt();
Thread.Sleep(500);
// Enable message queue to process events.
Application.DoEvents();
}
這裏有一些事情閱讀:
這裏是我的代碼修改後的版本,它使用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();
}
}
你想要什麼反覆運行,直到用戶單擊表單? – 2010-05-24 18:11:12
實際上,當v達到360時,v被重置爲0,所以我沒有很好地說明問題。我希望這個代碼用它自己的小方法繼續運行,直到用戶單擊表單或按下一個鍵。 – jimmy 2010-05-24 18:28:15
RunIt()做什麼? – 2010-05-24 18:36:30