簡體   English   中英

C# 使程序等待按鈕被按下

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM