我想找开一个比较大的图像文件,打开时我快速只读取其中一部分,然后开辟一个工作线程用来处理整个数据并生成一个预览,问题就在这个线程中,我启动线程的代码是
HANDLE hThread = (HANDLE)_beginthread(BuildOverViewThread,0,this);
线程的代码是
void BuildOverViewThread(LPVOID pParam)
{
CDataBlock* poBlock = (CDataBlock*)pParam;
poBlock->BuildOverView();
poBlock->m_bGenOverView = true;
_endthread();
}
在CDataBlock的BuildOverView()函数中,程序开始好好的,处理几行数据后就报异常错误,这是怎么回事,如何解决?如果我在HANDLE hThread = (HANDLE)_beginthread(BuildOverViewThread,0,this);
下面加一句
WaitForSingleObject(hThread,INFINITE);
就什么错误也不报了,但根本体现不出来线程的好处,程序会一直等这个工作线程做完再继续向下执行,我希望的是开辟这个工作线程后,就不管它,愿意什么时候结束就什么结束,不要影响我后面的操作,可是在调试过程中,开始能看到这种效果,过一会就不行了,然后就再不能恢复了,总是报错,请问这个该如何解决呢?

解决方案 »

  1.   

    poBlock->BuildOverView(); 处理的时候,线程跑到其他地方去了,poBlock指的数据可能已经释放了
    把poBlock的数据放到堆上,并保证线程处理的时候一致数据有效
      

  2.   

    BuildOverView中做了些什么?线程运行过程中,CDataBlock对象会不会被销毁?
      

  3.   

    是不是线程死锁了?你的主线程和beginthread使用同一资源?
      

  4.   

    这个线程是在CDataBlock类中创建的,为了能让线程访问一些必要的参数,我把CDataBlock类对象的指针this传了进去,在线程内部运行过程中,内存只一次申请,等处理完成后才释放,但处理到一半时,突然报错,如果在调用线程后加上WaitForSingleObject(hThread,INFINITE); 就什么错也不报,因为我打开文件采用了第三方的类库,这个类库在打开文件时是以独占的方式,也就是它打开后,不允许别的程序再写或访问这个文件,我怀疑是不是因为这个,但除此以外,实在找不出原因,而如果是这个原因,我一时也想不出解决办法,因为这个第三方类库我是必须得采用的,这该怎么办呢
      

  5.   


    new --- delete的方式
      

  6.   

    回楼上的仁兄,线程里面只有一次new,最后delete,可程序是在for循环的中间报错,比如我要生成的缩略图有180行高,生成到40行时突然报错,而且报错的callback是第三方类库的dll,如果说我自己申请的内存有错,那我在线程外加上等待线程执行完毕那句后,程序不出现任何错误显然证明了不是的。
      

  7.   

    在传递进去前把poBlock 先new,再传递进去,这样线程处理的时候,一致有效
    线程结束后在delete
      

  8.   

    原来程序报错是在四核CPU的机器上,回到我的双核IBM小黑上就一切正常,一点也不报错了,这是怎么回事呢?该如何解决?
      

  9.   

    这个问题貌似前面有帖子讨论过...以前串型的要多考虑同步的问题,还有编译器也不要再用老的vc6等,升级到vs2005/2008
    http://topic.csdn.net/u/20081208/15/F518FDE4-79A9-4182-B6E9-AA3FCE002212.html
    http://topic.csdn.net/u/20081212/09/FA36D137-7C94-447C-A854-B1BC06A33240.html