2012-12-29 13 views
1

在我的Windows窗体应用程序中,我有一个while循环,它不断地轮询一个操纵杆设备的值,并不断用这些值更新GUI,然后刷新GUI。但是,只要我在while循环中,UI就不会响应任何交互。我可以在表单应用程序中查询while循环内的用户交互事件吗?

有没有办法在我的while循环中查询任何 GUI事件或按钮点击或按键之类的交互?

我希望能够退出循环,如果某些事件或交互发生在哪里。我至少想要关闭和最小化按钮的工作。

因为我只需要轮询游戏杆并每秒更新GUI 20次,那么大部分循环时间就是休眠时间。但我希望在这段时间内等待事件和互动。

+0

为什么不使用Windows消息呢? – billz

回答

0

我已经解决了这个问题,比我想象的要简单得多。基本上它似乎是一个GUI应用程序中的while循环是一个坏主意。试图从一个单独的线程更新图形用户界面与一个while循环将无法​​正常工作或只是不好的编程习惯。

而不是使用while循环连续调用一个无限期的函数,而是使用一个计时器来触发一个函数,每隔50ms轮询一次操纵杆。这意味着剩下的时间GUI可以自由地更新自己。我不需要强制刷新或查询任何用户交互。由于这些功能只运行很短暂,所以GUI有足够的时间来呼吸,并且不会有任何交互或事件被错过。

总结起来,定时器驱动的函数调用可以替代while循环,并且可以将您从GUI中的多线程噩梦中拯救出来。

0

您使用的是游戏控制器吗?如果是这样,你如何从中获得输入?

使用正常的Windows输入(鼠标和键盘),您可以调用被覆盖的OnXxx方法(或调用相应的事件)。

显然,在不拖延UI的情况下执行阻塞操作或长时间运行操作的常用方法是在单独的线程中运行该操作。但是,这取决于您如何从设备获得输入。

相关问题