Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使程序等待按钮按下_C#_Loops_Button_Wait_Boolean - Fatal编程技术网

C#使程序等待按钮按下

C#使程序等待按钮按下,c#,loops,button,wait,boolean,C#,Loops,Button,Wait,Boolean,我想让程序在继续之前等待按钮被按下,我尝试创建一个while循环,让它循环直到按钮被点击,并将while循环结束时的bool设置为true,这使它崩溃 while (!Redpress) { // I'd like the wait here } Redpress = false; 不管while是否存在,只要程序在将“Redpress”设置为false之前等待按钮按下。。。有什么想法吗?使用事件-这就是它们的设计目的 您不需要在按钮中使用布尔变量,单击事件处理程序调用您的代码: p

我想让程序在继续之前等待按钮被按下,我尝试创建一个while循环,让它循环直到按钮被点击,并将while循环结束时的bool设置为true,这使它崩溃

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

Redpress = false;

不管while是否存在,只要程序在将“Redpress”设置为false之前等待按钮按下。。。有什么想法吗?

使用事件-这就是它们的设计目的

您不需要在
按钮中使用布尔变量,单击事件处理程序调用您的代码:

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窗体控件具有可在窗体构造函数中订阅的单击事件:

myButton.Click += myButton_EventHandler;
然后,您可以在处理程序中放入希望发生的任何逻辑,并在单击按钮时执行:

private void myButton_EventHandler(object sender, EventArgs e)
{
    Redpress = false;
}
您应该避免阻塞表单应用程序中的主线程(以任何方式,旋转睡眠等),因为这将锁定接口,有许多方法可以避免这种情况,包括计时器、线程、委托和后台工作人员等等

编辑:包括您的更新

为此,您可以使用
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语言,也应该使用信号量或类似的东西。但这似乎不是你真正需要的,它更像是你想要的东西。

不确定你为什么要坚持下去,我认为这才是真正的问题。 我猜您的代码在某些情况下希望在用户操作时执行另一个代码,然后恢复主块中的其余代码

在处理此类情况时,我使用自己的队列控制器类。 该类实际上执行AddAction(Action)、PlayNext()和HasActions()

因此,在您的这一点上,我将代码添加到我的类中的一个操作的循环之后,并执行AddAction

我还在按钮事件中执行AddAction(Action,position),然后在HasActions()PlayNext()时执行


这样我就不会阻塞界面,并确保按钮代码将在我的两段代码之间运行。

这没有意义,redpress是一个bool,它定义按钮是否被单击,我已经有一个事件在按下按钮时将bool设置为true。我需要代码让程序等待事件…@Zizo47-对不起,我误解了-将您需要的代码放在处理程序中我用注释指示的位置。这仍然没有改变任何事情,我需要让程序停止并等待我单击按钮,我对按钮本身没有问题。@Zizo47-你说的“停止”是什么意思。如果你把代码放在事件处理程序中,在按下按钮之前它不会被执行。让我再解释一下,这是一个simon says游戏,它的等待会闪烁用户必须按下的按钮,然后“等待”用户按下它。我想让它在该代码的约束范围内等待,这样只要按下按钮,它就不会继续。你在那里做的所有事情都是将redpress设置为false on,然后打开一个事件,我需要程序等待“that”事件…按钮事件已经存在,我需要程序等待事件。不能在用户界面线程中编写这样的代码。它将冻结用户界面。理解UI编程的事件驱动本质对于取得成功至关重要。