3 图形显示自动刷新技术
在连续动态显示过程中, 当屏幕由一个场景变化为另一个场景时, 须首先将原先的背景擦除, 然后将新的图形绘制到屏幕上, 但显示背景不断擦除以及绘制图形所用时间较长, 导致屏幕出现不连续[4],即刷新闪烁现象。为此我们在此提出几种解决途径。
3.1 Web网页自动刷新技术
在Web网页中自动更新显示,可在Web网页设计中使用META语句来实现。META语句放置在HTML或ASP代码的头部,如网页每隔5秒刷新一次,可以通过以下META语句来实现:
<HEAD><META HTTP-EQUIV=“REFRESH” CONTENT=“5” URL="http://202".206.210.146/Trendshow1.ocx> </HEAD>
刷新一次,整个文件重新执行一次到数据库的连接,把数据库中相应的图形数据的变动反映给客户端
。这种方法简单,适用于以只读方式向客户端提供数据,其刷新频率不宜过快,否则当相应的数据变化较快或比较多时可能出现屏幕显示不连续,即闪烁现象,不利于数据的监测。因此,本方法适用于数据实时性不强或变化比较缓慢的条件下实现数据的实时显示。
3.2 基于Java程序的更新数据
监控电厂生产过程的相关数据,要将实时数据和实时趋势曲线显示在监控画面上。可以采用Java Applet小程序直接与Web服务器相连获取实时数据库中实时数据,然后利用Java程序自身的多线程和绘图优势来实现图形数据的自动刷新。为了将背景画面和与实时数据相关的图形、数字区分开,通常采用双缓存技术把背景画面载入,在Java小程序的Paint()函数中编写与实时数据相关的图形、数据的显示代码。在Java小程序的线程Run()函数中利用DAO等实现对数据库的查询,Java小程序线程的休眠时间由Sleep()函数决定。每次线程运行时,对数据库重新查询得到新的数据,并使得小程序重画,这样就把动态的图形数据反映给客户。Java小程序执行速度快,刷新频率较快,适合实时图形数据的读取和显示。
3.3 图形画面刷新无闪烁
利用ActiveX组件技术实现远程监控的图形动态显示,可以彻底解决动态显示时自动刷新出现的闪烁现象。一般来说,解决刷新闪烁现象的方法有两个方面:一是避免反复设置背景监控画面和清屏;二是避免直接在屏幕上重画。
为此,采用双缓冲技术来解决刷新闪烁,即利用ActiveX控件在客户端建立内存缓冲区,把原来直接在屏幕上的绘图操作全部改在缓冲区里绘制,最后再将缓存区中绘制好的图形一次性画到屏幕上。对于一般实时性不强的画面,刷新周期设置低点,可以解决刷新闪烁现象;对于实时性较强的图形数据,通过这种方法也基本能消除刷新闪烁。
首先利用组态软件把监控背景画面和各种图元绘制好,存放在应用服务器中;其次,通过ActiveX控件中的CDataPathProperty类异步下载图形元件,缓存到客户端中,供控件调用。ActiveX控件中实现绘图的部分代码如下:
{……
//将位图句柄调入缓冲区
CBitmap*pOldBitmap=m_pdcMemory->SelectObject(m_pBitmap);
m_pdcMemory-> SelectClipRgn(NULL);
m_pdcMemory->IntersectClipRect(&rectUpdate);
……
//用位图填充指定的图形区域
m_pdcMemory->PatBlt(rectUpdate.left,rectUpdate.top, rectUpdate.Width(), rectUpdate. Height(),PATCOPY);
//将指向缓冲区的指针传递给绘图函数
OnDraw (m_pdcMemory);
//将缓冲区中的绘好的图形复制到屏幕上
dc.BitBlt(rectUpdate.left,rectUpdate.top,rectUpdate.Width(),rectUpdate.Height(),m_pdcMemory,rectUpdate.left,rectUpdate.top,SRCCOPY); ……}