举个例子,当我们使用ACDsee(或者任意一个图片浏览程序)打开某个目录(建设目录为D:\Pics)下的图片时,点击ACDSee界面上的“下一个”菜单,就自动打开下一幅图像。不知道ACDSee内部是如何实现的,我自己写的一个单文档图像处理程序里面,是这样实现的:
 int m_nIndex;//记录当前打开文件名的位置
 CStringList m_szList;//保存遍历得到的文件名
 BOOL IterateDirFile(CString szDir);//遍历szDir目录下的文件名,并存储在m_szList里面。
 BOOL OpenFile(CString szFileName);//打开m_nIndex位置的文件。
这种实现方式有个缺点,当文件数量很大时,比如100个,第一幅图像的显示就比较慢了,因为要先遍历,耗时,从第二幅开始就不会有延时的感觉了。
这个问题的解决方案我是这么想的:设置一个缓存,先遍历前10个文件,然后就开始打开显示,后面的大量文件在后台慢慢遍历并存储在m_szList里。
我这里的主要问题是如何自动处理这些文件,要求速度尽量快。恳请各位大大指点思路,小弟感激不尽!

解决方案 »

  1.   

    恩,这个思路不错,多谢!问题出在这里:我重载了OnOpenDocument(LPCTSTR lpszPathName)用来打开BMP图像,没问题。然而,在View里面写了线程函数来处理图像:
    g_nCount=0;//View里面定义的全局变量
    CXXXDoc* pgDoc;  //View里面定义的全局变量
    void CXXXView::OnBnStartProcess()
    {
          pgDoc = GetDocument();
          AfxBeginThread(ThreadProcessBMP,NULL);
    }
    UINT ThreadProcessBMP(LPVOID pParam)
    {
      
        pgDoc->OnOpenDocument();//读取图像数据到内存lpDIBBits,实际运行时出错,不知何故
        ProcessImg(lpDIBBits,lWidth,lHeight);//处理图像,并更新显示
        AfxBeginThread(ThreadProcessBMP,NULL);//线程循环,处理下一幅
    }
    我用while循环实现了连续处理,但是处理后的图像并没有更新显示,只有最后一帧图像更新显示了,可能是假死现象,用线程的方式应该能避免假死,使得每一帧都在处理完毕后更新显示。
    问题是打开图像出错,调试无果,还请指点!多谢啦
      

  2.   


    您好!多谢您的指点!现在的问题是如何实现Doc/View 成员和变量的相互调用问题。我在Doc里重载了OnOpenDocument(lpszFilename)用以打开图像。但是我在View里面定义的线程函数ThreadProcessBMP中却无法调用。我是这么做的:
    //以下代码在View里面实现
    CXXXDoc *pDoc;//全局变量
    CXXXView::OnTest()
    {
       pDoc= GetDocument();
    }
    UINT ThreadProcessBMP(LPVOID pParam)
    {
       CString szCur = pDoc->filelist.GetAt(nIndex)
       pDoc->OnOpenDocument(szCur);//运行时出现Debug Assertion Failed。Release版可以执行,WHY?
    }
      

  3.   

    pgDoc->OnOpenDocument();//读取图像数据到内存lpDIBBits,实际运行时出错,不知何故
    pgDoc不要用全局变量,采用线程参数传入试试:
    UINT ThreadProcessBMP(LPVOID pParam)
    pPara参数就是pgDoc,然后用pParam来调用OnOpenDocument();//试试
      

  4.   

        你只是把pgDoc这个变量传入线程,其它的你不用变,你继续按你的想法去做,因为pgDoc只是一个唯一的值,除非你建立多个文档类。
        我忘了是类的全局变量在不同的线程里的值不一致,还是工程的全局变量在不同的线程有不同的值,
      

  5.   

    你创建一个线程就好了,要遍历的时候给线程PostThreadMessage就好了
      

  6.   


    版主你好!我是用发消息的方式,但是有个问题:我的线程函数在a.cpp,我怎么把消息发给CXXXView.cpp的视图窗口呢?a.cpp没法包含CXXXView.h吧。也就是说,在CXXXView里面开启a.cpp里面的线程函数,怎么让线程函数获得视图串口呢?
      

  7.   


    传pgDoc好像也不行啊,Debug版本还是会崩溃(Debug Assertion Failed!),但是Release版就没问题。