在我的 windows 窗体应用程序中,我有一个 while 循环,它不断地轮询操纵杆设备的值,并用这些值不断更新 GUI,然后刷新 GUI。但是,只要我处于 while 循环中,UI 就不会对任何交互做出响应。
有没有办法在我的 while 循环中查询任何GUI 事件或交互,例如按钮单击或按键?
如果发生某些事件或交互,我希望能够退出循环。我至少希望关闭和最小化按钮起作用。
因为我只需要每秒轮询操纵杆和更新 GUI 20 次,所以大部分循环时间只是睡眠时间。但我想在这段时间等待事件和互动。
在我的 windows 窗体应用程序中,我有一个 while 循环,它不断地轮询操纵杆设备的值,并用这些值不断更新 GUI,然后刷新 GUI。但是,只要我处于 while 循环中,UI 就不会对任何交互做出响应。
有没有办法在我的 while 循环中查询任何GUI 事件或交互,例如按钮单击或按键?
如果发生某些事件或交互,我希望能够退出循环。我至少希望关闭和最小化按钮起作用。
因为我只需要每秒轮询操纵杆和更新 GUI 20 次,所以大部分循环时间只是睡眠时间。但我想在这段时间等待事件和互动。
你在使用游戏控制器吗?如果是这样,您如何从中获得输入?
使用普通的 Windows 输入(鼠标和键盘),您将调用重写的 OnXxx 方法(或调用相应的事件)。
显然,在不停止 UI 的情况下执行阻塞或长时间运行的操作的常用方法是在单独的线程中运行该操作。但是,这实际上取决于您如何从设备获取输入。
我解决了这个问题比我预期的要简单得多。基本上,GUI 应用程序中的 while 循环似乎是个坏主意。尝试使用 while 循环从单独的线程更新 GUI是行不通的,或者只是不好的编程习惯。
我没有使用 while 循环无限期地连续调用一个函数,而是使用一个定时器来触发一个函数,该函数每 50 毫秒轮询一次操纵杆。这意味着 GUI 在其余时间可以自由更新自己。我不需要强制它刷新或查询任何用户交互。因为这些功能只运行非常短暂,所以 GUI 有足够的时间来呼吸,不会错过任何交互或事件。
总而言之,计时器驱动的函数调用可以替代 while 循环,并且可以使您免于 GUI 应用程序中的多线程噩梦。