簡體   English   中英

Win32程序應始終為多線程嗎

[英]Should a win32 program always be multi-threaded

現在,我正在編寫一個win32 / opengl應用程序,每個窗口有2個線程。 一個線程處理opengl繪圖,另一個線程處理Windows消息事件。 我的問題是,我是否應該僅對所有Windows消息使用1個線程? 這會導致諸如Windows偶爾不響應的問題嗎?

我正在使用多個Windows消息循環,它們都在不同的線程上。 在我看來,消息循環是為1個線程設計的,在一個進程中只有一個出現。 這個對嗎?

我應該只對所有Windows消息使用1個線程嗎?

您可以,也可以。 它不是由操作系統強制執行的,但可能是由您的GUI框架強制執行的。

這會導致諸如Windows偶爾不響應的問題嗎?

它本身不會導致該問題。 消息循環響應不佳通常是由於在wndprocs / event-handlers中為處理來自OS UI驅動程序的消息的窗口執行了太多工作,或者實際上是在等待它們等待某些內容而不是及時返回GetMessage調用。 操作系統檢測到未處理來自KB等的消息,並傾向於使窗口模糊,並通常抱怨“未響應”應用程序。

如果使用WMQ與不處理UI消息的線程進行通信,例如消息號為WM_APP向上的消息,則如果處理此類消息的線程執行了冗長和/或阻塞的操作,然后返回到其操作系統,則OS將不采取任何措施GetMessage調用。

在我看來,消息循環是為1個線程設計的,在一個進程中只有一個出現。 這個對嗎?

不它不是。

Windows消息隊列和關聯的GetMessage()循環可以並且經常用於在進程的線程之間進行通信。 WMQ是專門的生產者-消費者隊列,主要用於傳達GUI消息。 這樣,它們對消息格式有約束,並且只有一個線程可以在隊列上等待,但是WMQ可以用於在非GUI線程之間進行通信。

正確的是,Windows已綁定到創建它們的線程,並且許多GUI Framewok的設計/編寫方式使得從多個線程中使用它們並不安全,但是在一個線程中使用許多Windows消息隊列和消息處理程序是不正確的。過程當然是可能的。

這取決於實現。 如果對獨立進程不應該打擾程序流程,那么多線程通常很有意義。 但是,還有其他方法也可以實現類似的目的。 例如,您可以使用計時器將流中斷幾毫秒,然后執行其他線程會執行的操作。

如果您認識到您的窗口事件線程正在達到極限,那比我首先想到的要大,您可能不僅在進行事件處理,而且在進行更多的計算。 在那里開始一個新線程是有意義的。

編輯:我不是Windows Pro。 但是我知道幾乎所有的實現都僅在事件系統中使用一個線程(循環)。 Qt有一些優雅的方法可以通過不同的方式生成新線程來規避中斷並擴展事件系統。 它還支持與計時器結合使用的信號/插槽。 也許您有興趣使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM