[英]C# Make Program Wait For Button To Be Pressed
我想讓程序在繼續之前等待按下按鈕,我嘗試創建一個while循環並讓它循環直到單擊按鈕並將while循環設置為true以結束while循環,這使它崩潰
while (!Redpress)
{
// I'd like the wait here
}
Redpress = false;
while 是否存在並不重要,只要程序在將“Redpress”設置為 false 之前等待按鈕按下...有任何想法嗎?
使用事件 - 這是它們的設計目的。
您不需要在Button_Click
事件處理程序調用您的代碼中為此使用布爾變量:
private void Button_Click(object sender, EventArgs e)
{
// The code you need to execute when the button is pressed
}
正如@trickdev 指出的那樣,您將需要訂閱此事件,但如果您使用 Visual Studio 中的“事件”窗口,它將為您添加必要的代碼 - 包括空處理程序。
使用事件驅動程序,您總是在等待下一個“事情”發生。 因此,在您的情況下(如果我正確理解了您的應用程序),當您啟動程序時,它應該簡單地告訴第一個按鈕閃爍“N”次。 如果您將其編寫為事件,則一旦代碼完成,應用程序將返回等待狀態。
然后在按鈕單擊事件處理程序中 - 您可以將所有按鈕訂閱到同一事件 - 您可以檢查是否按下了正確的按鈕,然后告訴下一個按鈕閃爍。 如果按下了錯誤的按鈕,則顯示合適的消息。
所以在偽代碼中你有:
public class Form
{
Initialise()
{
this.Loaded += FormLoaded;
}
private void FormLoaded(object sender, EventArgs e)
{
// pick a button
pickedButton.Flash();
}
private void Button_Click(object sender, EventArgs e)
{
if (sender == pickedButton)
{
pickedButton = pickButton();
}
else
{
message = "Sorry wrong button, try again";
}
pickedButton.Flash();
}
}
public class Button
{
public void Flash()
{
// loop N times turning button on/off
}
}
Windows 窗體控件有一個 Click 事件,您可以在窗體構造函數中訂閱它:
myButton.Click += myButton_EventHandler;
然后,您可以在處理程序中放置您想要發生的任何邏輯,這將在單擊按鈕時執行:
private void myButton_EventHandler(object sender, EventArgs e)
{
Redpress = false;
}
您應該避免在表單應用程序中阻塞(以任何方式,旋轉睡眠等)主線程,因為這會鎖定接口,有很多方法可以避免這種情況,包括計時器、線程、委托和 BackgroundWorkers 等等。
編輯:包括您的更新
為此,您可以使用ManualResetEvent
。
private readonly ManualResetEvent mre = new ManualResetEvent(false);
private void myButton_EventHandler(object sender, EventArgs e)
{
mre.Set();
}
您的表單代碼可以通過調用等待:
mre.WaitOne();
這將使執行代碼等到事件觸發。 希望有幫助。
注意:請不要誤會,除非您有一些特殊情況(在晚上的這個時候我想不出一個問題!)您應該將代碼直接放在事件處理程序中,而不是阻塞線程直到事件觸發。
如果您需要程序等待該事件,則不要在主訪問/頁面加載中編寫 waitForTheButton 代碼。
相反,寫事件中的代碼。 所以你不必主動等待。 活動就是為了這個。
例如:如果你有這樣的東西
static void Main()
{
while (notPressed) { }
DoThis();
DoThat();
}
那么你可以將其更改為:
static void Main
{
myButton.OnClick += myButton_EventHandler;
}
private void myButton_EventHandler(object sender, EventArgs e)
{
DoThis();
DoThat();
}
如果你真的想在程序范式中工作,即使你使用的是OOP語言,你應該使用信號量或類似的東西。 但這似乎並不是你真正需要的,它更像是你想要的。
不知道你為什么要堅持在那里,我認為這是真正的問題。 我猜你在一個代碼中,在某些情況下你想根據用戶操作執行另一個代碼,然后在主塊中恢復剩余的代碼。
當我處理這種情況時,我使用了我自己的 Queue Controller 類。 該類實際上執行 AddAction(Action)、PlayNext() 和 HasActions()
所以在你的那個時候,我在你的循環之后將代碼添加到我班級中的一個動作並執行 AddAction。
我還在按鈕事件中執行 AddAction(Action, position) 然后在 HasActions() PlayNext()
這樣我就不會阻塞界面並確保按鈕代碼將在我的兩段代碼之間運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.