windows-sendmessage

windows-sendmessage,windows,winapi,Windows,Winapi,我正在调用windows应用程序中WndProc函数的子例程。按下按钮时,从消息处理循环调用WndProc。子例程需要相当长的运行时间,因此它使用SendMessage(WM_USER)发送周期性消息。这些消息会导致屏幕更新。不幸的是,所有更新都被保留,直到子例程返回;此时,所有消息都会被处理,屏幕也会更新。消息的处理程序位于WndProc中;它使窗口无效,这将导致生成绘制消息 是否需要将子例程作为单独的线程运行?最好使用单独的线程。 但您也可以在您的中运行消息循环: 如果希望UI在子例程运行时

我正在调用windows应用程序中WndProc函数的子例程。按下按钮时,从消息处理循环调用WndProc。子例程需要相当长的运行时间,因此它使用SendMessage(WM_USER)发送周期性消息。这些消息会导致屏幕更新。不幸的是,所有更新都被保留,直到子例程返回;此时,所有消息都会被处理,屏幕也会更新。消息的处理程序位于WndProc中;它使窗口无效,这将导致生成绘制消息


是否需要将子例程作为单独的线程运行?

最好使用单独的线程。 但您也可以在您的中运行消息循环:


如果希望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; 
        } 
    } 
}