windows-sendmessage
我正在调用windows应用程序中WndProc函数的子例程。按下按钮时,从消息处理循环调用WndProc。子例程需要相当长的运行时间,因此它使用SendMessage(WM_USER)发送周期性消息。这些消息会导致屏幕更新。不幸的是,所有更新都被保留,直到子例程返回;此时,所有消息都会被处理,屏幕也会更新。消息的处理程序位于WndProc中;它使窗口无效,这将导致生成绘制消息windows-sendmessage,windows,winapi,Windows,Winapi,我正在调用windows应用程序中WndProc函数的子例程。按下按钮时,从消息处理循环调用WndProc。子例程需要相当长的运行时间,因此它使用SendMessage(WM_USER)发送周期性消息。这些消息会导致屏幕更新。不幸的是,所有更新都被保留,直到子例程返回;此时,所有消息都会被处理,屏幕也会更新。消息的处理程序位于WndProc中;它使窗口无效,这将导致生成绘制消息 是否需要将子例程作为单独的线程运行?最好使用单独的线程。 但您也可以在您的中运行消息循环: 如果希望UI在子例程运行时
是否需要将子例程作为单独的线程运行?最好使用单独的线程。 但您也可以在您的中运行消息循环:
如果希望UI在子例程运行时保持响应,则必须在子例程中发送消息(这本身会使您陷入重入障碍),或者将子例程移出到线程中。实现这一点的首选方法是使用辅助线程 在我的网站上有一个工作线程的介绍。当线程完成其工作时,您可以将已注册的消息发布回主窗口。辅助线程非常简单
期待你下一个关于取消一个冗长的操作的问题,在我的网站上有一个关于你可以选择的选项的讨论。警告,其中一些非常愚蠢,但我确实尽力做到完整:-)如果DoLengthyOperation函数中的线程关闭,while循环中的代码将如何执行?DoLengthyOperation()不会执行所有操作,只执行一部分,然后在下次调用它时返回并继续执行冗长的任务。
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;
}
}
}