C#让程序等待按钮被按下
Posted
技术标签:
【中文标题】C#让程序等待按钮被按下【英文标题】:C# Make Program Wait For Button To Be Pressed 【发布时间】:2011-08-03 10:50:05 【问题描述】:我想让程序在继续之前等待按钮被按下,我尝试创建一个 while 循环并让它循环直到单击按钮并将 bool 设置为 true 以结束 while 循环,这使得它崩溃了
while (!Redpress)
// I'd like the wait here
Redpress = false;
while 是否存在并不重要,只要程序在将“Redpress”设置为 false 之前等待按钮按下...有什么想法吗?
【问题讨论】:
按钮事件已经存在,需要程序等待事件发生。 您不能在用户界面线程中编写这样的代码。它将冻结用户界面。了解 UI 编程的事件驱动性质对于取得成功至关重要。 【参考方案1】:使用事件 - 这是它们的设计目的。
您不需要在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
【讨论】:
这没有意义,redpress 是一个布尔值,它定义了按钮是否被点击,我已经有一个事件在按下按钮时将布尔值设置为 true。我需要代码让程序等待事件... @Zizo47 - 对不起,我误解了 - 将您需要的代码放在我在评论中指出的处理程序中。 这仍然没有改变任何事情,我需要程序停止并等待我点击按钮,按钮本身没有问题。 @Zizo47 - “停止”是什么意思。如果您将代码放在事件处理程序中,则在按下按钮之前它不会被执行。 让我再解释一下,这是一个西蒙说游戏,它的等待闪烁用户必须按下的按钮,然后“等待”用户按下它。我想让它在该代码的约束内等待,所以只要按下按钮它就不会继续。【参考方案2】: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();
这将使执行代码等到事件触发。希望对您有所帮助。
注意:请不要误会,除非您有一些特殊情况(我想不出一个在我的头顶上的夜晚!)您应该将代码直接放在事件处理程序中,而不是在事件触发之前阻塞线程。
【讨论】:
您所做的所有事情都是在某个事件上将 redpress 设置为 false,我需要程序等待“那个”事件...【参考方案3】:如果您需要程序等待该事件,那么不要在主访问/页面加载中编写 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 语言,你应该使用 Semaphore 或其他东西像那样。但这似乎不是你真正需要的,它更像是你想要的。
【讨论】:
【参考方案4】:不知道你为什么要坚持下去,我认为这是真正的问题。 我猜你在一个代码中,在某些情况下你想在用户操作时执行另一个代码,然后在主块中恢复剩余的代码。
当我处理这种情况时,我使用自己的队列控制器类。 该类实际上做了 AddAction(Action)、PlayNext() 和 HasActions()
所以在你的那个时候,我将循环之后的代码添加到我的类中的一个动作中并执行 AddAction。
我也在按钮事件中执行 AddAction(Action, position) ,然后在 HasActions() PlayNext() 时执行
这样我不会阻塞界面并确保按钮代码将在我的 2 段代码之间运行。
【讨论】:
以上是关于C#让程序等待按钮被按下的主要内容,如果未能解决你的问题,请参考以下文章