C#使程序等待按钮按下
我想让程序在继续之前等待按钮被按下,我尝试创建一个while循环,让它循环直到按钮被点击,并将while循环结束时的bool设置为true,这使它崩溃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 (!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编程的事件驱动本质对于取得成功至关重要。