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个模块是否死机了,如果死机就把相应的模块启动起来
我们看看其中一个的定义(其他基本意思一样):
这个监控主程序还是比较简单的,不过里面用到了不少windows api,希望你们好好揣摩揣摩。
不过dephi已经把这些api重新封装过了,看起来还是比较顺眼的呵呵。
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的函数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;
我们看看其中一个的定义(其他基本意思一样):
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;
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;
当然还有其他一些修饰的东西,这里不累诉了。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重新封装过了,看起来还是比较顺眼的呵呵。