各位高手:前几天我用VC变了一个处理位图的程序,结构采用单文档的视图分割,将试图分割为3个子视图,两个CView类,一个CFormView类,主要数据放在文档类中,要处理的位图比较大,用CArray存放位图的每个象素值,程序中需要处理的数据比较多,CPU的占用率几乎在程序运行的时候都是100%,但这些都是一些比较简单的操作,无非就是改变位图的一些数据,在显示出来。(位图的操作用VC技术内幕中的CDIB类)现在我想请教:1、 怎么样才能使程序在时间上运行慢一点,避免CPU占用太多,除了Sleep()还有没有其他的方法。2、在程序运行的过程中,(没有设置鼠标忙)当我将鼠标移到任务栏上该程序所在位置时,程序就会被卡住,几个视图都不更新(试图更新都是调用相应类的OnDraw函数),内部数据还在运算。等到程序结束的时候,视图才会更新。

解决方案 »

  1.   

    不管采用什么办法,你的运算量不会减少,反之由于采取一些手段,比如多线程,事实上增加了程序运行时间。采用多线程的好处是界面可以刷新(不等于加速),可以给用户一种假象。在数据结构和算法上的改变可能更加重要,比如你用CArray来处理位图数据,就是一种可以说最低效的方法。
      

  2.   

    GUI不响应的问题,当然是使用多线程,如果需要,可以降低线程的优先级为THREAD_PRIORITY_BELOW_NORMAL。处理位图数据,最方便的办法就是使用一个byte array(CArray是动态申请的内存,这会大大增加你程序的负担),而且作为类成员变量,在程序启动的时候申请足够的内存-比如10M(我怀疑你是不是在一个消息响应函数中申请的内存,只是简单的运算应该不会占有很多的cpu),如果不够,再重新分配。
    最好是在自己的heap中申请内存,参考HeapCreate, HeapAlloc, HeapReAlloc. 这样比较快,而且出错的时候不会影响到其它模块。
      

  3.   

    谢谢楼上的朋友。
    我是将CArray作为文档的成员变量,在开始进行复杂的运算以前,已经为其通过成员函数SetSize()分配了内存。我要处理的数据是以每个象素点为单位。个人觉得这样可能方便一些。
    我所涉及的复杂运算主要是在我的一个循环中,在一次迭代中,需要检查位图中每个象素的取值,并且改变一些象素点的值(这里的判断条件比较多,算法不能简化了,计算量也可能较大),然后在将这幅位图在原来的视图窗口中更新。