C # Заставить программу ждать нажатия кнопки - PullRequest
5 голосов
/ 12 апреля 2011

Я хочу, чтобы программа ждала нажатия кнопки, прежде чем она продолжится, я попытался создать цикл while и сделать его циклом, пока кнопка не будет нажата, и установить bool в true для завершения цикла while, это сделало это сбой

   while (!Redpress)
                    {
                        //I'd like the wait here
                    }
                    Redpress = false;

Неважно, есть ли время в данный момент, пока программа ожидает нажатия кнопки, прежде чем установить для «Redpress» значение false ... Есть идеи?

Ответы [ 3 ]

6 голосов
/ 12 апреля 2011

Используйте события - это то, для чего они предназначены.

Вам не нужно использовать логическую переменную для этого в обработчике событий 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
    }
}
2 голосов
/ 12 апреля 2011

В элементах управления Windows Forms есть событие 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();

Это заставит исполняющий код ждать, пока событие не сработает.Надеюсь, что это поможет.

ПРИМЕЧАНИЕ: Пожалуйста, не заблуждайтесь, хотя, если у вас нет особого случая (я не могу вспомнить один из них в моей голове в это время ночи!), Вы должны поставитькод прямо в обработчике событий, вместо того, чтобы блокировать поток, пока событие не сработало.

0 голосов
/ 12 апреля 2011

Если вам нужна программа для ожидания этого события, тогда не пишите код 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 , вам следует использовать семафор или что-то подобное. Но это не то, что вам на самом деле нужно , это больше похоже на то, что вы хотите .

...