进度反馈慎用SendMessage

由于工作需要,编写了一个解析300M字符串的MFC小程序。为了显示出当前的解析进度,使用了MFC的消息:

void WorkThreadFunction()

{

    UIWnd->PostMessage(WM_PROGRESS, BEGIN, NULL);

    while(notEnd())

    {

        ......

        UIWnd->PostMessage(WM_PROGRESS, DATA, ProcessedLength);

    }

    UIWnd->PostMessage(WM_PROGRESS, END, NULL);

}

在实际运行中,发现END消息基本上都会在最后一个DATA消息之前到达。为修正该错误,将PostMessage改为SendMessage。结果发现,虽然消息的时序性得到了保证,却消耗了处理本身9倍的时间(100M的文本处理时间由2秒上升到20秒)。

解决的办法有两种:

1。减少发送DATA的次数。如果进度是用百分比或千分比表示的,则仅在百分比或千分比发生变动时才发送。

2。使用共享数据:工作线程中将进度数据保存,UI线程中使用定时器主动取得共享数据,然后显示出来:

enum enumState

{

    BEGIN,

    DATA,

    END,

};

struct structProgressInfo

{

    enumState State;

    DWORD ProcessedLength;

}g_ProgressInfo;

void WorkThreadFunction()

{

    g_ProgressInfo.State = BEGIN;

    while(notEnd())

    {

        ......

        g_ProgressInfo.State = DATA;

        g_ProgressInfo.ProcessedLength = ProcessedLength;

    }

    g_ProgressInfo.State = END;

}

CMyDialog::OnTimer()

{

    switch(g_ProgressInfo.State)

    {

    ....

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值