时,收费员处理不过来,而有时十分钟,甚至一个小时都没有一辆车(深夜常见的现象)。因此,定时器时间间隔不好定。间隔过大不能达到收费数据实时发送的要求,过小则计算机资源消耗过多,且在长时间无车时,显然是做无用功。因此,采用定时发送收费数据的方式很不合理。
Windows系统是消息(Message)驱动的操作系统。Window的应用程序通过对接收到的各种消息进行处理来完成任务。因此基于Window的消息响应机制可以建立Back.EXE程序和Toll.EXE程序之间的实时通信以实现收费数据的实时上传。其具体实现过程为: A.在Toll.EXE程序中先定义消息。当程序处理完了一条收费记录(即收费数据存入当地数据库表中后)后,Back.EXE程序发送已定义的消息,在发送消息之前,要先找到Back.EXE程序的窗口句柄。 Const Wm_TollMsg=WM_USER+1000 //定义消息 If HwndBack=0 then //找Back.EXE程序的窗口句柄 HwndBack::=FindWindow('TFrmBack','Back') PostMessage(HwndBack,wm_TollMSG,0,0) //向Back.EXE程序发送消息 B.在Back.EXE程序中定义消息,此处消息和A中定义的消息为同一消息;然后定义消息处理过程。这个消息处理过程主要是把当地数据中未发送的数据向收费站服务器发送。 Const Wm_TollMSG=WM_USER+1000 //定义消息 Public Procedure DoTollMsg(Var Msg:Tmessage);Message wm_TollMsg; Procedure TfrmBack DoTollMsg(var Msg:Tmessage); //宣告消息处理过程 Begin WriteSoldb //向服务器发送收费数据 End 图像的自动抓拍、
压缩和上传 图像抓拍是车道收费系统中的一个重要功能。入口图像抓拍可以严格控制"一车一卡"(只有系统抓拍到通行车图像收费员才能进行发卡操作);出口抓拍可以严格控制收费员人为地"大车判小车、收费车判
免费车"和对违章、冲关、免费车等进行稽查和处理。因此车道收费系统要实现图像自动抓拍,并要把抓拍到车道图像实时、可靠、自动地从车道控制机上传到服务器数据库,以供用户及时地进行图像稽核、
查询和管理。 图像自动抓拍原理为:车辆驶入收费车道触发一号地感线圈。车辆检测器检测到车辆并向数字IO板的相应输入端口发送信号,车道收费系统一直启动一线程在监视此IO端口,从而能实现实时采集到此信号,启动图像捕捉卡进行抓拍。 图像的抓拍可以使用Microsoft的Video For Windows SDK开发包,此开发包提供了视频和音频捕捉的全系统函数。车道收费系统只需抓拍静态的一帧图片,因此可以基于此开发包做一个简单的DLL库。同时,一般的视频捕捉卡制造商都会针对自己的卡提供二次开发的DLL或Active控件。笔者使用的视频捕捉卡是FlyVideo。此卡随带的开发包中有一个CapWnd.ocx控件。将其在Window中
注册和Delphi中引入后的图像抓拍非常简单。其函数如下: Function TfrmMain.CapBMP():Integer Begin Try Begin CapWnd1.Freeze; CapWnd1.SaveDib('Vehicle.bmp');//抓拍存为Vehicle.bmp图像 CapWnd1.Preview; End; Except Begin Result=-1; Exit; End; End; Result=0; End; 上面抓拍的图像是.bmp图像,图像文件很大(380×280约250~400K)。因此实际应用中必须压缩为文件很小的.Jpg文件。Delphi中有一个TjpegImage类用来处理JPEG文件。下面是笔者设计的一个由BMP文件压缩成JPEG文件的函数。其中压缩比Quality可由用户自定。 Function TfrmMain.BMPTOJPG(BmpFile,JpgFile:pchar;Quality:
word):integer; Var. Bmp:TbitMap; Jpeg:TjegImage; Begin Bmp:=nil; Jpge:=nil; If (Trim(BmpFile) = ' ') or (Trim(JpgFile) = ' ') then Begin Result=-2; Exit; End Try Begin Bmp:=Tbitmap.create; //建