win32程序应该始终是多线程的

Ben*_*Ben 2 c++ opengl winapi multithreading

现在我正在编写一个win32/opengl应用程序,每个窗口有2个线程.一个线程处理opengl绘图,另一个处理windows消息事件.我的问题是,我应该只为所有Windows消息使用1个线程吗?这会导致窗户偶尔没有响应等问题吗?

我正在使用多个Windows消息循环,所有这些都在不同的线程上.在我看来,消息循环是为1个线程设计的,并且在进程中只有一个外观.它是否正确?

Mar*_*mes 5

我应该只为所有Windows消息使用1个线程吗?

你可以,或者不.它不是由操作系统强制执行的,但它可能是由您的GUI框架实现的.

这会导致窗户偶尔没有响应等问题吗?

它本身不会导致这个问题.响应不良的消息循环通常是由于在wndprocs/event-handlers中执行太多工作导致处理来自OS UI驱动程序的消息的窗口,或实际上在等待它们而不是及时返回到GetMessage调用.操作系统检测到来自KB等的消息未得到处理,并且往往使窗口重影并且通常抱怨"无响应"应用程序.

如果WMQ用于与不处理UI消息的线程进行通信,例如,消息号为WM_APP的线程,则如果处理此类消息的线程在返回其之前执行冗长和/或阻塞操作,则操作系统将不采取任何操作. GetMessage调用.

在我看来,消息循环是为1个线程设计的,并且在进程中只有一个外观.它是否正确?

不它不是.

Windows消息队列和关联的GetMessage()循环可以并且通常用于在进程的线程之间进行通信.WMQ是专门的生产者 - 消费者队列,主要用于传递GUI消息.因此,它们对消息格式有约束,并且只有一个线程可以在队列上等待,但WMQ可用于在非GUI线程之间进行通信.

将窗口绑定到创建它们的线程是正确的,并且许多GUI框架的设计/编写方式使得从多个线程使用它们是不安全的,但是许多Windows消息队列和消息处理程序在一个过程当然是可能的.