首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

使用CComboBox时,初始化数据慢的有关问题(二)

2014-07-10 
使用CComboBox时,初始化数据慢的问题(二)前几天一直以为是动态生成控件导致程序初始化变慢。经过几天调试,

使用CComboBox时,初始化数据慢的问题(二)
前几天一直以为是动态生成控件导致程序初始化变慢。经过几天调试,发现是使用CComboBox中AddString浪费了程序初始化绝大部分的时间。

  这里有个半年前的帖子《使用CComboBox时,初始化数据慢的问题》
http://topic.csdn.net/u/20100210/13/3a4aaf86-1310-4661-8599-21539803fa18.html

  我专门做了个测试程序,仅初始化CComboBox就用了接近6秒。如果多几个这样的界面,耗时不可想象。
进一步采用了SetRedraw和InitStorage,以及用InsertString替换AddString。节省了也就50%左右的时间,也需要三秒多。
非常困惑,为什么动态初始化和非动态初始化数据时间差别那么大?有没有比较彻底的解决之道?谢谢!

初始化CComboBox数据代码如下:

C/C++ code
void CTestComboMenuDlg::InitComboMenu(void){    CString str = _T("");    CString strD;    int num = 32;    DWORD dwStart = ::GetTickCount(); //初始时间    for(int i=0; i<num; i++)    {        m_Combo1[i].ResetContent();//消除现有所有内容        m_Combo2[i].ResetContent();        m_Combo3[i].ResetContent();    }    for (int i=0; i<num; i++)    {         m_Combo1[i].InitStorage(33,10);         m_Combo3[i].InitStorage(33,10);        m_Combo1[i].SetRedraw(FALSE);         m_Combo3[i].SetRedraw(FALSE);        for (int j=1; j<33; j++)        {            str.Format(_T("%d"),j);            str = _T(" 输入") + str;            //m_Combo1[i].AddString(str);            m_Combo1[i].InsertString(j-1,str);            str = _T("");            str.Format(_T("%d"),j);            str = _T(" 输出") + str;            m_Combo3[i].AddString(str);            //m_Combo3[i].InsertString(j-1,str);        }        m_Combo1[i].SetRedraw(TRUE);         m_Combo3[i].SetRedraw(TRUE);     }    for(int i=0; i<num; i++)    {        m_Combo2[i].InitStorage(33,10);        m_Combo2[i].SetRedraw(FALSE);        for(int j=1;j<=401;j++)        {            strD.Format(_T("%d"),j);            strD += _T(" ch");            //m_Combo2[i].AddString(strD);            m_Combo2[i].InsertString(j-1,strD);        }        m_Combo2[i].SetRedraw(TRUE);    }    DWORD dwEnd = ::GetTickCount() - dwStart; //结束时间}

测试程序截图:


测试程序下载:
http://download.csdn.net/source/2680195


[解决办法]
这么多combox啊
[解决办法]
的确够多的啊。看到你这个问题,我想到了我以前做的一个工程里面,有48个CComboBox,初始化数据是有规律的,可是最后的几个CComboBox里面却没有数据。百思不得其解,我用的也是For循环。
[解决办法]
用VC的profile分析程序看看那个函数占用了最多的CPU时间。
[解决办法]
呵呵~我们之前也遇到类似的问题,在弹出的对话框中使用几十个CComboBox,初始化的时候特别慢,后来我们就改成用户自己输入的编辑框了,然后加上对编辑框的合理性判断~
[解决办法]
可能真正有用的只要一个,当用户点击某表项时,把唯一的combo移到用户点击的地方,再初始化这个combo

热点排行