首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows - sendmessage

windows - sendmessage
EN

Stack Overflow用户
提问于 2010-08-05 22:22:47
回答 2查看 385关注 0票数 0

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-05 22:30:30

如果您希望您的UI在子例程运行时保持响应,则必须在子例程中抽取消息(这本身可能会使您陷入重入困境),或者将子例程移出到线程中。执行此操作的首选方法是使用工作线程。

在我的网站here上有一个关于worker线程的介绍。当线程完成其工作时,您可以将注册的消息发送回您的主窗口。工作线程非常简单。

期待您下一个关于取消冗长操作的问题,在my site here上将讨论您可以使用的选项。警告,它们中的一些非常愚蠢,但我确实试图做到完整:-)

票数 0
EN

Stack Overflow用户

发布于 2010-08-05 22:29:17

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3415644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档