一个接收数据并时时显示的程序,由于接收原始数据利用到循环,所以采用多线程。由于在image上画线,涉及到线程同步问题,所以用wmcopydata发消息方式,保证数据访问的唯一性。一个程序主线程a用来在image上画线,线程b用来接收原始数据,并以wmcopydata的方式把大约50m的数据,大约每隔1秒发消息给主线程a,a收到后,进行数据分析,把数据以bmp图像方式处理成内存流,并用image.loadfromstream的方式在image上显示出来,在收到一定数据后,会先在事先生成的bitmap上画线,再一次贴到image上。现在遇到一个奇怪的问题:在显示属性为32色的情况下,程序运行正常,显示数据和画线过程正常;但在显示属性为增强16色或256色的情况的下,程序运行时,显示数据时正常,但在画线时明显看到image上出现画线过程缓慢,本来发一次消息时间内完全可以画完的线,画完占用了2,3次消息的时间,造成消息丢失的情况,这是怎么回事?难道是线程同步问题?但为什么32色可以,16色不行呢?

解决方案 »

  1.   

    图片颜色是多少位的??如果是标准24位的bmp图的话,在32位色环境下画就不用转换颜色值,因为32位色直接是在24位色上扩展了8位alpha值,而在16位环境下画的话需要对每一个像素进行颜色值的转换
    ,所以降低速度。
    ---
    以上是我的看法,如有不对的地方请多多指教~~
      

  2.   

    这个程序在32色的情况下处理数据显示出来用时40ms,而在增强16色的情况下处理数据显示出来用时300ms,为什么会出现这种情况?而且先32色程序正常,改为16色再运行程序就出现问题,再改回32色程序仍有问题,只有重起机器程序才能正常。有人遇到过类似的问题吗?另外我在程序中生成的bitmap是按256色情况设置的,也就是有1024个字节的调色板,难道是这个影响的?
      

  3.   

    我给处理过程加入时间,发现在32色下处理时间为30ms,而在16色下处理时间为300ms。通过进一步缩小范围,发现是bitmap1.canvas.draw(0,0,bitmap2)这句占用时间达250ms,而更奇怪的是只是当第一次运行此句时占用这么多时间,下面再用此句用时就比较正常在几ms内,这是为什么呢? 
      

  4.   

    在回调函数中或者是线程函数中写入这样的代码试试
      image1.Canvas.Lock;
      try
        image1.Canvas.............
      finally
        image1.Canvas.Unlock;
      end;
      

  5.   

    bitmap1.canvas.draw(0,0,bitmap2)改为CopyRect应该快很多
    至于为什么第一次运行此句时占用这么多时间,不懂为什么在16-256情况下慢?要进行移位查找调色板肯定慢