大家好:
      现在在做一个图片显示的程序,实现拖动浏览地图。(地图已经被切成很多小块小块的方格了)。
      当前的做法是每次拖动后,计算出当前需要显示的图片有哪几张(这个有自己的计算方法,用数据库来记录每张小图片的经纬度范围),然后去磁盘读取这几张图片加以显示。所以每次刷新都会进行一次图片文件的读取,严重影响程序的效率。
      现在有人提议采用多线程来实现这个过程。一个线程用于预加载图片进入内存,另一个线程用于刷新的时候直接从内存而不是从文件读取图片信息进行显示。预加载的图片除了当前要显示的图片外,还包括了上下左右等边界的图片。
      请问这个预加载怎么实现啊?加载进内存的这些图片怎么管理?我刷新的时候怎么去内存找(找文件的时候是根据路径)?关于那些图片满足显示条件。那些图片满足加载条件这个我自己能计算。
      举例说明:
      1.现有16张图片位置关系如下:
         1   2    3   4 
         5   6    7   8
         9   10   11  12
         13  14   15  16
     2.我当前需要显示6图片,同时把1、2、3、5、7、9、10、11图片进行预加载。
     3。向右移动图片后(假设刚好移动了一张图片),我需要显示7图片?怎么去内存中找?然后从新预加载4、8、12图片,卸载1、5、9图片。
谁做过相似的工作的请指教。

解决方案 »

  1.   

    给一些伪代码吧,假设每张图片可以通过索引来获取路径,暂定索引为 int定义一个结构
    typdef struct _MapItem
    {
        int nIndex;
        HBITMAP hBitmap;
    }MAPITEM;// 定义一个数组
    MAPITEM arrMap[9];// 定义当前索引
    int nCurIndex = -1;// 加载图片
    void LoadBitmaps(int nCurIndex)
    {
         // 根据 nCurIndex 获得图片路径
         ....
         // 加载文件到 arrMap[4] 并指定 index
         ....
         // 获得 nCurInex 左上文件图片路径及Index
          ...
         // 加载文件到 arrMap[0] 并指定 index
         // 获得 nCurInex 中上文件图片路径及Index
          ...
         // 加载文件到 arrMap[1] 并指定 index
         ...
         /// 如此类推
    }// 选择图片
    HBITMAP NextBmp(int nDirection)
    {
        // nDirection 0: 左上 1:左中 如此类推
        HBITMAP = arrMap[nDirection].hBitmap;
        nCurIndex = arrMap[nDirection].nIndex;
        // 这里可以转为多线程加载
        LoadBitmaps(nCurIndex);
        return HBITMAP;
     }基于以上的思路就可以实现LZ的要求。
    以上代码没有涉及资源释放
      

  2.   

    动态的话就需要考虑采用动态结构了,比如vector类。。多线程的话,我前段时间刚做了一个基于多线程的监控多画面实现。在MFC下实现,基本结构和一般的普通的线程有些区别。主要是受孙鑫老师的多线程教程的启发。楼主可以参考下。
      

  3.   


       经过这两天的思考和尝试,大概思路和你说的差不多。只是还有一些问题不是很清楚。
      1.怎么把各种图片的文件读入内存以位图句柄存储?我之前用的IImage接口读取的png或gif格式的图片,然后他有一个Draw函数直接就绘制在DC中了。中间没有可以获得的位图句柄。请问怎么比较方便的读取各种格式的图片以获得句柄?
      2.用一个数组(或类似的东西,我想的是map,可以存其他图片信息)储存这些预加载的位图句柄,当需要更新的时候,只是更新其中需要更新的部分,并不是把满足的图片重新加载一遍,原来已经加载的就还保留,只加载新加入的,并删掉不用了的。请问这个怎么解决不较好?就是对这个预加载图片的管理
      
      

  4.   

    用map.将经纬度信息与图片handle map起来,如果需要的图片不在内存的时候再载入。每次窗口刷新的时候自己在做一次内存调整,把map中远离当前中心坐标的图片释放,这样map就不会膨胀了。