Winapi 在Win32应用程序中连续运行代码

Winapi 在Win32应用程序中连续运行代码,winapi,win32gui,Winapi,Win32gui,我有一个工作的GUI,现在需要添加一些代码,这些代码需要持续运行,并用数据更新GUI。这个代码应该放在哪里?我知道它不应该进入消息循环,因为它可能会阻止传入窗口的消息,但我不清楚这段代码可以在我的窗口进程中的何处运行。您有一个选择:您可以使用线程并将消息发回主线程以更新GUI(或者直接更新GUI,但如果使用MFC,请不要尝试此操作),或者,您可以使用一个计时器,它会定期向您发布消息,然后您只需实现一个计时器处理程序,并在那里执行您需要执行的任何操作 线程最适合于可能阻塞的复杂、缓慢的进程。如果获

我有一个工作的GUI,现在需要添加一些代码,这些代码需要持续运行,并用数据更新GUI。这个代码应该放在哪里?我知道它不应该进入消息循环,因为它可能会阻止传入窗口的消息,但我不清楚这段代码可以在我的窗口进程中的何处运行。

您有一个选择:您可以使用线程并将消息发回主线程以更新GUI(或者直接更新GUI,但如果使用MFC,请不要尝试此操作),或者,您可以使用一个计时器,它会定期向您发布消息,然后您只需实现一个计时器处理程序,并在那里执行您需要执行的任何操作


线程最适合于可能阻塞的复杂、缓慢的进程。如果获取数据的过程很快(和/或可以设置为出错时超时),那么计时器就更简单。

您有没有研究过线程

通常,您会创建一个线程来执行后台任务(在本例中,读取电压数据)并将其存储到共享缓冲区中。GUI线程只是每隔一段时间(在重画时,每30秒,当用户单击刷新等)读取一次缓冲区并显示数据

后台线程按照自己的时间表运行,从操作系统获得CPU时间,并且不绑定到UI或消息泵。它可以使用某种类型的计时器来监视数据源,并在必要时读取数据

现在,由于线程分别运行,并且可能同时运行,因此您需要让它们相互了解。这可以通过锁实现(查看互斥锁)。例如:

  • 监视器读取当前电压并将其存储在缓冲器中
  • 后台/监视器线程锁定保存最新样本的缓冲区
  • 监视器将内部缓冲区复制到共享缓冲区
  • 监视器解锁缓冲区
  • 用户界面线程同时但分别执行以下操作:

  • 获取一个重新绘制的调用
  • 等待缓冲区解锁,然后读取值
  • 使用缓冲区值绘制UI
  • 在大多数Windows GUI生成语言中,设置和使用新线程非常简单。C/++和C#都有非常简单的API,用于创建新线程并使其在某些任务中工作,您通常只需要为线程提供一个要处理的函数。有关C示例,请参见

    线程和锁定的概念在很大程度上与语言无关,在大多数受C启发的语言中也是类似的。您需要让主线程(在本例中可能是UI)控制工作线程的生命周期:在创建UI后启动工作线程,并在关闭UI前将其杀死


    这种方法在前面有一点开销,特别是在数据获取非常简单的情况下。如果数据源发生更改(网络请求、某些阻塞数据源、读取物理传感器的实际线路等),则只需更改监视器线程,用户界面无需知道。

    您需要指定使用哪种语言(VC++、C#等)你正在使用开发你的windows应用程序。这对于StackOverflow来说可能太广泛了。我不知道为什么使用MFC会很重要。Win32 UI基本上是单线程的。无论哪种方式,发布消息都是合适的。我只是不记得它是否可以从线程将消息发布到win32 wndproc,我知道如果您尝试在线程中调用GUI更新方法,MFC会发出可怕的呕吐声。谢谢,是的,我一开始尝试使用线程,但我的GUI非常不稳定,所以我最终使用了计时器…现在一切正常:)谢谢,我尝试使用线程(我以前从未实际使用过线程),但我的GUI不稳定(很难解释,页面上没有显示任何内容…)所以我把它们拿出来,使用了gbjbannb答案中提到的计时器。我觉得线程是实现这种持续更新的正确方法……我想我需要阅读更多关于线程的内容,以完全理解为什么什么都不起作用