2010-08-05 45 views
1

我在Windows應用程序中調用WndProc函數的子例程。當按下按鈕時,WndProc從消息處理循環中被調用。子例程需要相當長的時間才能運行,所以它使用SendMessage(WM_USER)發送週期性消息。這些消息應該會導致屏幕更新。不幸的是,這些更新都保存到子程序返回之前;那時所有的消息都被處理並更新了屏幕。該消息的處理程序位於WndProc中;它會使應該產生繪圖消息的窗口失效。windows - sendmessage

我是否需要將子例程作爲單獨的線程運行?

回答

0

如果你想在子程序運行你的用戶界面保持響應,您可能已泵子程序中的消息(這本身可以讓你進入重-entrancy nasties),或將子例程移出到一個線程。執行此操作的首選方法是使用Worker線程。

在我的網站here上有工作線程的介紹。當線程完成其工作時,您可以將註冊消息發送回您的主窗口。工作線程非常簡單。

預計您的下一個問題取消冗長的操作,我們的網站here有一個討論可供您選擇的選項。警告,其中一些非常愚蠢,但我確實嘗試完成:-)

0

最好的方法是使用單獨的線程。 但是你可以在你的handler function運行消息循環太:

HWND hwnd; 
BOOL fDone; 
MSG msg; 

// Begin the operation and continue until it is complete 
// or until the user clicks the mouse or presses a key. 

fDone = FALSE; 
while (!fDone) 
{ 
    fDone = DoLengthyOperation(); // application-defined function 

    // Remove any messages that may be in the queue. If the 
    // queue contains any mouse or keyboard 
    // messages, end the operation. 

    while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) 
    { 
     switch(msg.message) 
     { 
      case WM_LBUTTONDOWN: 
      case WM_RBUTTONDOWN: 
      case WM_KEYDOWN: 
       // 
       // Perform any required cleanup. 
       // 
       fDone = TRUE; 
     } 
    } 
} 
+0

如果線程在DoLengthyOperation函數中關閉,while循環中的代碼將如何執行? – 2010-08-05 14:35:48

+0

DoLenghtyOperation()不執行所有操作,只執行一部分操作,然後返回並在下次調用冗長任務時繼續執行。 – Stefan 2010-08-06 09:38:44