问个性能优化的有关问题。clistctrl
问个性能优化的问题。clistctrl
一个就是,现在要给clistctrl里面加载一个csv文件的数据:
大概是个200*1000多行的样子
类似下面这样
每次读出来,加载进去都要挺久的,完后界面就卡在那里不动了。。。
应该怎么搞,让这个看起来友好一点?或者怎么加载快一点
添加一列就要好久
------解决思路----------------------
这种情况,肯定不能在主线程里面搞了,不然就像死了一样。在主线程中选定文件后,将其交给子线程去读取,每读完一行,将数据用消息发给主线程,主线程将新信息写入列表中。
友好一点,先计算出行数,就可以在主线程中进行读取进度的显示了,来个进度条吧
------解决思路----------------------
+1
尽管计算总耗时肯定是这个方法多,但是用户响应快啊,最多就是屏幕闪烁厉害而已。
------解决思路----------------------
1.总数可以用单独的文件存放,比如你要读取a.csv,那你就放一个a.tmp,是否加密就看需要了,里面就一个总数的数值,读之前先读这个文件,然后进度条或者正在载入的动画效果出现
一个就是,现在要给clistctrl里面加载一个csv文件的数据:
大概是个200*1000多行的样子
类似下面这样
0.1900618,0.1899746,0.1898563,0.1897121,0.1895543,0.1893981,0.189259,0.1891525,0.1890941,0.1890989,0.1891797,0.1893451,0.1895996,0.1899446,0.190378,0.190894,0.1914835,0.1921343,0.1928291,0.1935436,0.1942479,0.1949128,0.0.6084
每次读出来,加载进去都要挺久的,完后界面就卡在那里不动了。。。
应该怎么搞,让这个看起来友好一点?或者怎么加载快一点
添加一列就要好久
CCSVOperator CSVOperator;
CSVOperator.LoadCSV("画图数据.csv");
// 要是加载不成功,要返回个啥。。。
for (int i = 0;i < CSVOperator.indexOfColumn; ++i)
{
CString str;
std::string* pString = CSVOperator.GetString(1,i+1);
str.Format("%s",pString->c_str());
m_listctrl.InsertColumn(i ,str , LVCFMT_CENTER, 50); // 添加第1列,
}
加载的函数:
bool CCSVOperator::LoadCSV(const char* path)
{
indexOfLines = 0;
indexOfColumn = 0;
FILE* pfile = fopen(path, "r");
if (pfile)
{
fseek(pfile,0,SEEK_END);
u32 dwsize = ftell(pfile);
rewind(pfile);// 指针回到文件开头
char* filebuffer = new char[dwsize];
fread(filebuffer, 1, dwsize, pfile);
std::map<u32, std::string> StringMap;
char* pBegin = filebuffer;
char* pEnd = strchr(filebuffer, '\n');//查找换行首次出现的位置
u32 uiIndex = 1;
while (pEnd != NULL)
{
std::string strbuff;
strbuff.insert(0, pBegin, pEnd-pBegin);
if (!strbuff.empty())
{
StringMap[uiIndex] = strbuff;
}
pBegin = pEnd + 1;
pEnd = strchr(pEnd + 1, '\n');
++uiIndex;
}
indexOfLines = uiIndex - 1;
delete[] filebuffer;
std::map<u32, std::string>::iterator iter = StringMap.begin();
for (; iter != StringMap.end(); ++iter)
{
std::vector<std::string> StringVec;
std::map<u32, std::string> l_StringMap;
StringParser::GetParamFromString(iter->second, StringVec);
if (indexOfColumn< StringVec.size())
{
indexOfColumn = StringVec.size();//保存最大的列数
}
for (int i = 0; i < StringVec.size(); ++i)
{
l_StringMap[i+1] = StringVec.at(i);
}
m_StringKeyMap[iter->first] = l_StringMap;
}
fclose(pfile);
m_CSVName = path;
return true;
}
return false;
}
------解决思路----------------------
这种情况,肯定不能在主线程里面搞了,不然就像死了一样。在主线程中选定文件后,将其交给子线程去读取,每读完一行,将数据用消息发给主线程,主线程将新信息写入列表中。
友好一点,先计算出行数,就可以在主线程中进行读取进度的显示了,来个进度条吧
------解决思路----------------------
+1
尽管计算总耗时肯定是这个方法多,但是用户响应快啊,最多就是屏幕闪烁厉害而已。
------解决思路----------------------
1.总数可以用单独的文件存放,比如你要读取a.csv,那你就放一个a.tmp,是否加密就看需要了,里面就一个总数的数值,读之前先读这个文件,然后进度条或者正在载入的动画效果出现