线程大文件复制进度开发笔记

在实际开发中,文件复制是比较常见的操作,而这也常常需要复制进度的提示,而复制的操作应该在线程中完成,而进度提示在界面中显示,所以需要工作线程和界面的消息传递。

初版:

BYTE buf[1024];

    UINT readed;

 

    unsigned __int64 dTotal = rfile.GetLength();    

    int nPrePos = 0; // 当前进度

    int nPercent = 0;//当前百分比

 

    while ((readed = rfile.Read(buf, 1024)) > 0)

    {

         wfile.Write(buf, readed);

 

         // 计算进度

         nPrePos += readed;

         nPercent = (int)((float)nPrePos / dTotal * 100 + 0.5);

 

         // 向主线程窗口发送进度提示消息

         ::PostMessage(pTheadParam->hWnd,WM_THREADPROG, pTheadParam->nFileID, nPercent);

    }

该方式简单,但只适合小文件,对于大文件,由于向主线程窗体发送消息过于频繁,导致窗体不能响应鼠标操作.

 

对于大文件的复制,思路可以是一般进度是从一到一百,当进度没有改变的时候不需要法消息给主界面刷新,所以可以做如下改进:

    unsigned __int64 dTotal = rfile.GetLength();

    int nPrePos = 0;     // 当前进度

    int nPrePercent = 0; // 当前百分比

    int nNxtPercent = 0; // 当前百分比

 

    while ((readed = rfile.Read(buf, 1024)) > 0)

    {

         wfile.Write(buf, readed);

 

         // 计算当前进度

         nPrePos += readed;

         nNxtPercent = (int)((float)nPrePos / dTotal * 100 + 0.5);

 

         // 进度改变

         if (nPrePercent != nNxtPercent)

         {

             nPrePercent = nNxtPercent;

             // 向主线程窗口发送进度提示消息

             ::PostMessage(pTheadParam->hWnd,WM_THREADPROG, pTheadParam->nFileID, nPrePercent);

         }

    }

这样的话当进度有变化的时候才发送消息,总共100次消息,这样主窗体还可以及时响应其他操作,特别适合多线程场景。

你可能感兴趣的:(开发心得)