我在Windows應用程序中調用WndProc函數的子例程。當按下按鈕時,WndProc從消息處理循環中被調用。子例程需要相當長的時間才能運行,所以它使用SendMessage(WM_USER)發送週期性消息。這些消息應該會導致屏幕更新。不幸的是,這些更新都保存到子程序返回之前;那時所有的消息都被處理並更新了屏幕。該消息的處理程序位於WndProc中;它會使應該產生繪圖消息的窗口失效。windows - sendmessage
我是否需要將子例程作爲單獨的線程運行?
我在Windows應用程序中調用WndProc函數的子例程。當按下按鈕時,WndProc從消息處理循環中被調用。子例程需要相當長的時間才能運行,所以它使用SendMessage(WM_USER)發送週期性消息。這些消息應該會導致屏幕更新。不幸的是,這些更新都保存到子程序返回之前;那時所有的消息都被處理並更新了屏幕。該消息的處理程序位於WndProc中;它會使應該產生繪圖消息的窗口失效。windows - sendmessage
我是否需要將子例程作爲單獨的線程運行?
最好的方法是使用單獨的線程。 但是你可以在你的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;
}
}
}
如果線程在DoLengthyOperation函數中關閉,while循環中的代碼將如何執行? – 2010-08-05 14:35:48
DoLenghtyOperation()不執行所有操作,只執行一部分操作,然後返回並在下次調用冗長任務時繼續執行。 – Stefan 2010-08-06 09:38:44