炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4890|回复: 5

在C++ 中使用时的多线程问题

[复制链接]

该用户从未签到

发表于 2012-3-25 21:00:57 | 显示全部楼层 |阅读模式
本帖最后由 指剑龙门 于 2012-3-25 21:01 编辑

我在一个窗体的某按钮按下事件中创建了一个线程,该线程用来读取数据库中的数据并不断更新界面上的文字或图片,线程启动后主窗体失去响应,对主窗体的任何操作都无响应,请教有什么解决办法?
还有附带问下XStatic_SetText()后调用XEle_ReDrawEle()更新显示的效率有多高,怎么我感觉没有想象中的快呢,好像跟MFC下的速度差了好多,是不是用XWnd_ReDrawWndRect()的效率更高呢?
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2012-3-25 21:47:12 | 显示全部楼层
    界面操作请在主线程, 界面重绘不要太频繁, 可用定时器,100毫秒刷新一次!
    透明窗口,元素透明,都会降低效率,尽量减少重绘区域大小;

    比如数据库有1万条数据,更新显示到软件UI的时候,不要刷新1万次,可以100毫秒刷新1次界面,更新完成,停止定时器!
    插入数据到UI元素的时候,数据太多,提示需要用户等待,或者分时间片插入数据到UI元素 ,不影响用户对界面的操作!不然会阻塞界面线程消息,导致界面暂时卡住!

    播放电影的刷新频率也只有每秒30次左右!

    XStatic_SetText(hEle,L"1");
    XStatic_SetText(hEle,L"2");
    XStatic_SetText(hEle,L"3");
    XStatic_SetText(hEle,L"4");
    XEle_ReDrawEle(hEle);

    该用户从未签到

     楼主| 发表于 2012-3-25 22:33:42 | 显示全部楼层
    谢谢赐教,呵呵,我把刷新的代码的注释掉又测试了下,在线程运行时主窗体可以响应操作,这说明确实是因为XStatic_SetText()后XEle_ReDrawEle()效率比较低,线程中我是每刷新一次都sleep(100)的,当只有一个static刷新时可以响应主窗体操作,但是当一次有四个Static要刷新时主窗体就不响应操作了

    该用户从未签到

     楼主| 发表于 2012-3-26 20:35:39 | 显示全部楼层
    借鉴您的方法,在主线程中更新界面,我又抽空对文本更新速度测试了下,主要代码:
        HELE hStatic = XStatic_Create(nSL,nST,nSW,nSH,L"1",hWindow);
          //XEle_SetBkTransparent (hStatic, TRUE);
          XStatic_SetTextColor(hStatic,RGB(0,0,0));       
          XStatic_SetTextAlign(hStatic,DT_CENTER);
          XEle_SetFont(hStatic,hFont);
    影响更新速度的主要因素有:
    1. 控件所在位置有背景图片,背景图片越多速度越慢;
    2. 控件所在窗体通过XWnd_SetImageNC()设置背景图,也会对速度产生较大影响;
    3. 静态文本框本身为设为背景透明,使得重绘速度极大地变慢,这个影响最为明显;
    4. XEle_ReDrawEle()本身比较慢,使用XWnd_ReDrawWndRect()代替会使重绘速度有所提升,但还是达不到理想速度;

    问题:
    1. XEle_ReDrawEle()按理说只重绘控件自己,而XWnd_ReDrawWndRect() 要绘制制定举行区域的所有控件,为何前者比后者的速度还慢?
    2.窗体通过XWnd_SetImageNC()设置背景图后会对文本更新速度产生极大影响,不知有没有避免的方法?
    3. static控件就是用来显示文本的,一般都不需要背景颜色,建议像MFC中那样,默认就是背景透明的,但是背景透明会使更新速度极大变慢,期待能改进;

    我是想实现像抽奖时手机号不断滚动的效果,窗体背景当然有很多透明图片,这样视觉效果才比较好,但是现在的问题就是文本更新速度太慢,不知有没有好的解决办法?敬请赐教!!!
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2012-3-26 21:17:10 | 显示全部楼层
    XEle_ReDrawEle() 是重绘该元素区域! 如果元素区域大就会慢.

    如果你重绘频率控制好,CPU 不会超过百分之十!

    该用户从未签到

    发表于 2013-11-16 16:43:44 | 显示全部楼层
    admin 发表于 2012-3-25 21:47
    界面操作请在主线程, 界面重绘不要太频繁, 可用定时器,100毫秒刷新一次!
    透明窗口,元素透明,都会降低效率, ...

    你好,请问为什么我另外开辟一个线程然后窗收口发送消息,消息处理函数里面的元素句柄全部是脏数据,可是我可以保证已经初始化了,同样的代码,在单线程下可以运行的好好的,为什么多线程会为空呢?
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-5-8 18:29 , Processed in 0.082408 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表