使用多线程绘图(一)

类别:VC语言 点击:0 评论:0 推荐:
一.问题的提出
      微软资源管理器一般来说应该算是一个非常优秀的软件,但是其微软资源的图像浏览功能应该来说是有些问题的(可能是我的windows版本比较老(windows2000),且不说JPEG的BUG,就他采用的单线程读图应该就算是不合理之处,为什么这么说,我们可以做个试验,首先构造一个BMP图像,图像应尽可能大一点,我选择了6146*2048的24位色的图片,大约36M多,当点击此图片后,系统将非常缓慢的显示此图片的预览图,而且无法快速切换至其他文件(可能是我的机器太慢了),很明显微软在这里没有采用多线程处理,系统将把图像的所有数据读入内存后才进行处理显示,这就容易造成读取大图像文件的死机.因为在读取文件的过程中用户是无法中断的. 如何能快速切换文件呢? 一般对于一个需要较长时间处理数据的程序,用户可能希望在处理过程中提前中断当前的数据操作,我们有几种方式处理:
      1.采用单线程处理方法:
       这种方法一般采用的方法是在数据处理的过程中加入
       MSG message;
       if (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
           ::TranslateMessage(&message); 
           ::DispatchMessage(&message);
       }
      等语句,如果发生用户中断或其他消息,则系统执行用户中断或其他消息相应的消息处理程序,消息处理完成后,程序再返回原来数据处理过程继续执行相关的代码. 这种方式的优点就是编程简单,只要在程序中设置一个全局变量,在用户中断消息中改变这个变量,数据处理时判断如果变量改变则退出处理即可.在一般情况下这种办法还是比较有效的,但是这种方法也有些问题,比如在这种情况下,你的鼠标按住窗口不停的拖动,系统就不会运行数据处理直到你松开鼠标按钮.由于数据处理很容易被系统的消息所干扰,采用这种方法在实际程序的运行过程中会使人感觉程序不是很流畅. 
       2.采用多线程处理方法 这里我们可以将文件分为界面线程和工作线程,工作线程负责读取文件并发送读取进度和读取内容到界面线程,而界面线程负责界面的显示和用户切换文件后,结束工作线程.需要指出的是在目前的单CPU+WINDOWS的环境下采用多线程进行数据,并不能提高数据的处理速度(超线程CPU除外),他所能提高的是界面的反应速度,即界面的友好程度.当然这种友好程度也会被一些其他程序过多的占用CPU所干扰.

二.如何使用多线程 (待续)

本文地址:http://com.8s8s.com/it/it545.htm