我的應用程序從工作線程繪製圖形超過10年,現在我從來沒有遇到過任何問題。工作線程吸引到我的HWND
(由主線程創建的)是這樣的:從子線程繪製到窗口
hdc = GetDC(hwnd);
SetDIBitsToDevice() ... or StretchDIBits()
ReleaseDC(hwnd, hdc);
已經移植我的應用到其它平臺後,我開始意識到,任何其他線程比主線程繪圖通常是禁止在許多平臺上(例如macOS)。我的研究表明,Win32也可能是這樣,但我仍然缺乏明確的答案。
因此,我的問題:
是否允許吸取我的窗前,彷彿從工作線程沒有創建它畫到窗口上面顯示?請注意,工作線程真的是繪製到窗口的唯一線程。主線程不執行任何繪圖。甚至沒有在WM_PAINT
。在我的情況下,在WM_PAINT
中繪製是不必要的,因爲工作線程以50fps繪製。
如果不允許,將繪圖從工作線程委託給主線程的最佳方法是什麼?
http://stackoverflow.com/questions/5622850/hwnd-thread-affinity-painting-from-a-different-thread – VuVirt
這是絕對錯誤的Win32,並一直是。如果它可靠地工作(我懷疑它沒有,這些錯誤很難重現),這是一個意外。所有繪圖都應該在響應'WM_PAINT'時段內完成。爲什麼應用程序需要以50 fps的速度繪製?如果這是一款遊戲或者其他一些實際需要50 fps的奇特業務,那麼您應該使用DirectX或其他任何類型的遊戲。 –
無論如何,如果你必須做到這一點遍佈多個線程:讓你的工作線程準備DIB部分,然後讓它通過調用'RedrawWindow'來強制窗口立即重繪。然後主線程將收到一條「WM_PAINT」消息,並在該消息處理程序內部,將DIB部分與消息一起繪製到您收到的DC中。再次,目前還不清楚使用多線程在這裏購買了什麼,但這會使它工作。 –