SendMessage和PostMessage造成刷新界面闪动不同

zsb534923374 2015-06-10 11:34:14
在线程中,分别用这两个函数发同一消息,
消息处理函数是对主界面的一个LISTCTRL控件插入值
但是发现使用PostMessage时,会造成绘图闪动很严重
而使用SendMessage时,主界面绘图不会闪动

本身绘图部分使用了双缓冲。

在消息处理函数中,如果删掉DeleteAllItem函数时,PostMessage后,界面也不会闪动
但是需要每一次插入值时将LIST先清空

使用SendMessage时虽然不会闪动,但是会造成阻塞。
请问这种情况怎么处理
...全文
386 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tinary3v0 2015-06-12
  • 打赏
  • 举报
回复
引用 4 楼 happyparrot 的回复:
尽量不要用DeleteAllItems,这样需要清空一遍再插入,一慢二闪。 如果数据量变化不大,只是内容变化,可以直接用SetItemText进行行信息更新。对比刷新前后的行变化,如果新的行数更多,那么多出的这部分,用InsertItem增加;如果新的行数少,那么原先多出的这些行,用DeleteItem删除。避免先清空后再重新插入的情况。
给你的空间增加双缓存绘图属性 类似 TVS_EX_DOUBLEBUFFER(根据你的控件查找对应属性) 然后按照上面这个说的做,应该就已经做到了速度最快了;界面一般不会闪。 可以考虑定时刷新,避免消息过于频繁造成刷新不过来;原则上,数据保持高速统一,但界面定时刷新即可。
zsb534923374 2015-06-11
  • 打赏
  • 举报
回复
引用 4 楼 happyparrot 的回复:
尽量不要用DeleteAllItems,这样需要清空一遍再插入,一慢二闪。 如果数据量变化不大,只是内容变化,可以直接用SetItemText进行行信息更新。对比刷新前后的行变化,如果新的行数更多,那么多出的这部分,用InsertItem增加;如果新的行数少,那么原先多出的这些行,用DeleteItem删除。避免先清空后再重新插入的情况。
数据量是很多,我在发完消息后,SLEEP(10),发现闪烁明显减少
zsb534923374 2015-06-11
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
// Updating a control or window with large amounts of data may cause 
// flicker. In such cases it may be better to turn off drawing

//m_list is a member of type CListCtrl
m_List.SetRedraw(FALSE);  // turn drawing off regardless of list mode

//
// Update control
//

m_List.SetRedraw(TRUE);  // turn drawing back on and update the window

// invalidate the entire control, force painting
m_List.Invalidate();
m_List.UpdateWindow();
这个代码的功能是什么呢,看不太明白啊
zsb534923374 2015-06-11
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
PostMessage发送是不是过于频繁,造成界面刷新过快,你可以做一些过滤
是发送比较频繁,过滤的话该如何做呢
赵4老师 2015-06-11
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
快乐鹦鹉 2015-06-10
  • 打赏
  • 举报
回复
尽量不要用DeleteAllItems,这样需要清空一遍再插入,一慢二闪。 如果数据量变化不大,只是内容变化,可以直接用SetItemText进行行信息更新。对比刷新前后的行变化,如果新的行数更多,那么多出的这部分,用InsertItem增加;如果新的行数少,那么原先多出的这些行,用DeleteItem删除。避免先清空后再重新插入的情况。
笨笨仔 2015-06-10
  • 打赏
  • 举报
回复
首先,你程序结构设计就不合理 其次,Send和Post的区别就在于前者是等待发送完成后再返回,后者是立即返回。 对于消息处理中出现的界面闪动,可通过设计进行改善。
Eleven 2015-06-10
  • 打赏
  • 举报
回复
// Updating a control or window with large amounts of data may cause 
// flicker. In such cases it may be better to turn off drawing

//m_list is a member of type CListCtrl
m_List.SetRedraw(FALSE);  // turn drawing off regardless of list mode

//
// Update control
//

m_List.SetRedraw(TRUE);  // turn drawing back on and update the window

// invalidate the entire control, force painting
m_List.Invalidate();
m_List.UpdateWindow();
oyljerry 2015-06-10
  • 打赏
  • 举报
回复
PostMessage发送是不是过于频繁,造成界面刷新过快,你可以做一些过滤

16,372

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧