使用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