Delphi在这个工程里作为中间层起到的作用是
   1.调用下层api函数。
   2.负责通讯(上位机和下位机)。
   3.负责对下位机传上来的数据进行解码,容错和控制。
   4.负责对上位机下发的数据进行解码,容错和控制。
由于考虑到程序整体的稳定性大致按功能分为:
    主控程序(PTX):主要作用是控制这4个模块的稳定性。比如这4个模块中任何一个崩溃了,需要自动重启之。
    无线电接口程序(Server):主要作用和无线电发射机进行交互,因为整个工程是无线电和GPRS并用的。
    GPRS接口程序(GPRSServer):主要作用和GPRS硬件模块进行交互。
    ActiveX接口程序(ServerIn):主要作用是和网页中的ActiveX插件进行交互。
    Java后台接口程序(ClientIn):主要作用是和Java后台进行交互,当然java用的是jsp平台。
精力有限我只能一天一点给你们分析了,不重要的东西我就省略了,比如里面一个按钮是什么作用啦等等我就不写了。
   首先是主控程序(PTX)-->
这里用到了一个定时器Timer1,它的作用是每隔1妙作一次循环检测,检测上面4个模块是否死机了,如果死机就把相应的模块启动起来
procedure TFormTX.Timer1Timer(Sender: TObject);
var
dwExitCode:Dword;
fprocessExit:
boolean;
begin
     dwExitCode:
=0;
     fprocessExit:
=GetExitCodeProcess(PProcInfo_SERVER.hProcess,dwExitCode);
     
if  (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then //判断相应模块是否退出了或者是状态不为激活状态了
       begin
         memo1.Lines.Add(
'Sever 进程终止!');
         CloseHandle(PProcInfo_SERVER.hThread);//杀线程
         CloseHandle(PProcInfo_SERVER.hProcess);//杀进程
         ProccessSuccessful_SERVER;//重启相应的模块
         memo1.Lines.Add(
'Sever 进程启动!');
       end;

      dwExitCode:
=0;
     fprocessExit:
=GetExitCodeProcess(PProcInfo_ServerIn.hProcess,dwExitCode);
     
if  (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
       begin
         memo1.Lines.Add(
'ServerIn 进程终止!');
         CloseHandle(PProcInfo_ServerIn.hThread);
         CloseHandle(PProcInfo_ServerIn.hProcess);
         ProccessSuccessful_ServerIn;
         memo1.Lines.Add(
'ServerIn 进程启动!');
       end;

      dwExitCode:
=0;
     fprocessExit:
=GetExitCodeProcess(PProcInfo_ClientIn.hProcess,dwExitCode);
     
if  (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
       begin
         memo1.Lines.Add(
'ClientIn 进程终止!');
         CloseHandle(PProcInfo_ClientIn.hThread);
         CloseHandle(PProcInfo_ClientIn.hProcess);
         ProccessSuccessful_ClientIn;
         memo1.Lines.Add(
'ClientIn 进程启动!');
       end;

      dwExitCode:
=0;
     fprocessExit:
=GetExitCodeProcess(PProcInfo_GPRSSERVER.hProcess,dwExitCode);
     
if  (fprocessExit and (dwExitCode<>STILL_ACTIVE)) then
       begin
         memo1.Lines.Add(
'GPRSSERVER 进程终止!');
         CloseHandle(PProcInfo_GPRSSERVER.hThread);
         CloseHandle(PProcInfo_GPRSSERVER.hProcess);
         ProccessSuccessful_GPRSSERVER;
         memo1.Lines.Add(
'GPRSSERVER 进程启动!');
       end;
end;
上面的代码中分为4个if 语句,每个if中有象ProccessSuccessful_SERVER,ProccessSuccessful_ServerIn,ProccessSuccessful_ClientIn,ProccessSuccessful_GPRSSERVER的函数
我们看看其中一个的定义(其他基本意思一样):
procedure TFormTX.ProccessSuccessful_SERVER;
var
bSuccess:
boolean;
begin
   
if findwindow('TFormServer',nil)=0 then
     begin
   ZeroMemory(@sStartInfo_SERVER,sizeof(sStartInfo_SERVER)); 
//zero memory
//设置必要的进程参数
   sStartInfo_SERVER.cb:
=sizeof(sStartInfo_SERVER);
   seProcess_SERVER.nLength:
=sizeof(seProcess_SERVER);

   seProcess_SERVER.lpSecurityDescriptor:
=Pchar(nil);
   seProcess_SERVER.bInheritHandle:
=true;
   seThread_SERVER.nLength:
=sizeof(seThread_SERVER);
   seThread_SERVER.lpSecurityDescriptor:
=Pchar(nil);
   seThread_SERVER.bInheritHandle:
=true;
//创建进程
   bSuccess:
=CreateProcess(Pchar(nil),Pchar(ExtractFilePath(Paramstr(0))+'Server'),@seProcess_SERVER,@seThread_SERVER,
                           false,CREATE_DEFAULT_ERROR_MODE,pchar(nil),pchar(nil),sStartInfo_SERVER,PProcInfo_SERVER);
   
if (not bSuccess)then
     Memo1.Lines.Add(
'Server 服务器创建失败!')
     else
     Memo1.Lines.Add(
'Server 服务器创建成功!');
     end;
end;

这个函数是用来重启相应的4个模块中的一个的。当然最后一个步骤是当PTX结束时要把4个模块全部杀死。

procedure TFormTX.FormClose(Sender: TObject; var Action: TCloseAction);
begin
      Timer1.Enabled:
=false;
      TerminateProcess(PProcInfo_SERVER.hProcess,
10);
      PProcInfo_SERVER.hProcess:
=0;
       TerminateProcess(PProcInfo_GPRSSERVER.hProcess,
10);
      PProcInfo_SERVER.hProcess:
=0;
      TerminateProcess(PProcInfo_ServerIn.hProcess,
10);
      PProcInfo_ServerIn.hProcess:
=0;
      TerminateProcess(PProcInfo_ClientIn.hProcess,
10);
      PProcInfo_ClientIn.hProcess:
=0;
      TerminateProcess(PProcInfo_DelayTime.hProcess,
10);
      PProcInfo_DelayTime.hProcess:
=0;
end;
当然还有其他一些修饰的东西,这里不累诉了。
这个监控主程序还是比较简单的,不过里面用到了不少windows api,希望你们好好揣摩揣摩。
不过dephi已经把这些api重新封装过了,看起来还是比较顺眼的呵呵。
posted on 2006-04-20 21:28  coffeeliu  阅读(1738)  评论(9编辑  收藏  举报