我有一个可用的GUI,现在需要添加一些需要连续运行的代码并使用数据更新GUI。这段代码应该放在哪里?我知道它不应该进入消息循环,因为它可能阻止传入消息到窗口,但我很困惑我的窗口进程可以运行这个代码。
答案 0 :(得分:2)
您可以选择:您可以使用线程并将消息发回主线程以更新GUI(或直接更新GUI,但如果使用MFC则不要尝试此操作),或者您可以使用计时器这将定期发布消息,然后您只需为计时器实现一个处理程序,并执行您需要的任何操作。
该线程最适合可能阻塞的复杂,缓慢的进程。如果获取数据的过程很快(和/或可以在出错时设置为超时),那么计时器就更简单了。
答案 1 :(得分:0)
你有没有看过线程?
通常,您将创建一个执行后台任务的线程(在这种情况下,读取电压数据)并将其存储到共享缓冲区中。 GUI线程只是经常读取缓冲区(重绘时,每30秒,当用户点击刷新时等)并显示数据。
您的后台线程按照自己的计划运行,从操作系统获取CPU时间,并且不受UI或消息泵的约束。它可以使用某种类型的计时器来监视数据源并在必要时读取内容。
现在,由于线程单独运行并且可能同时运行,因此您需要让它们彼此了解。这可以通过锁(查看互斥锁)来完成。例如:
同时,但另外,UI线程:
在大多数生成Windows GUI的语言中,设置新线程并使用它非常简单。 C / ++和C#都有非常简单的API用于创建新线程并使其适用于某些任务,您通常只需要为要处理的线程提供一个函数。有关C示例,请参阅the MSDN docs on CreateThread。
线程和锁定的概念在很大程度上与语言无关,在大多数C语言中都是类似的。您需要让您的主(在这种情况下,可能是UI)线程控制工作人员的生命周期:在创建UI后启动工作程序,并在关闭UI之前将其终止。
这种方法预先有一点开销,特别是如果您的数据提取非常简单。如果您的数据源发生变化(网络请求,某些阻塞数据源,从物理传感器读取实际线路等),那么您只需要更改监视器线程,UI就不需要知道。