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