问个性能优化的有关问题。clistctrl

问个性能优化的问题。clistctrl
一个就是,现在要给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,是否加密就看需要了,里面就一个总数的数值,读之前先读这个文件,然后进度条或者正在载入的动画效果出现