帮我看看如何用合理的程序结构来处理这个问题?(呵呵,大家都来关注一下嘛) (50分)

A

agangr

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要在程序中实时监控多个通讯端口发送过来的信号,并根据这些信号处理不同的
数据并通过这些端口发送给各终端,我想将整个处理过程放在Timer事件中用一个循环来处
理,问题是如果这样做,在处理与某个端口通讯的时候,另外的端口势必等待一个比较长
的时间,如何解决这个问题,有没有更好的解决的办法?
下面是我这段处理程序结构:
procedure TForm1.Timer1Timer(Sender: TObject);
var
state:integer;
p:integer;
test:integer;
begin
{监控各通讯端口数据,根据不同情况进行不同处理}
for p:=0 to phandle-1 do
begin
state:=Accept_Data(p);
if state<>-1 then
//接收到数据
begin
////////////////////////
case state of
1:
begin
Timer1.Enabled:=false;//关闭数据采集
if SendTime(p) then
//发送时间成功,开启数据采集
Timer1.Enabled:=True;
end;
2:
begin
//接收流水帐
Timer1.Enabled:=false;
if Accept_WasteBook(p) then
Timer1.Enabled:=True;
end;
3:
begin
//发送黑名单;
Timer1.Enabled:=false;
if Send_Backlist(p) then
Timer1.Enabled:=True;
end;
end;
////////////////////////////
end;
end;
end;





 
多线程可以解决
简单一点就使用多媒体计时
function timeSetEvent(uDelay, uResolution: UINT;
lpFunction: TFNTimeCallBack;
dwUser: DWORD;
uFlags: UINT): MMRESULT;
stdcall;
写个回调函数
会在单独的线程中运行
 
当然是线程,但要注意同步.
 
各位,能不能详细点啊
 
多线程可以解决
 
问题是我应该将那部分代码分离出来让它在多线程中运行?
 
我作过一个GPS程序,用的是三个串口,其中一个代码是
procedure TForm1.zjportReceiveData(Sender: TObject;
Buffer: Pointer;
BufferLength: Word);
begin
SetLength(zjstr, BufferLength);
//接收RS232的数据
Move(Buffer^, PChar(zjstr)^, BufferLength);//串口数据放入zjstr中
Sjcl(zjstr,'zj');//数据处理
end;
我用的是SPCOMM控件,把收到的数据送入Sjcl()过程中处理。
 
to:自由自在
问题不是在哪儿哦,首先我不用SPCOMM,我们不一定就是通过串口来通讯
我们是用的自己的通讯程序。
我要解决的问题是:
1、在任何时候接收多个端口来的信号(读过程),如何做?只能循环检测吗?
2、根据1中接收的数据,立即做相应的处理,并向对方发送数据
如何在处理数据的过程的同时,接收其它端口信号并做响应
譬如:当我收到某一个端口发来要求我回传系统时间的请求信号,我根据这个信号,将
服务器系统时间传过去,在传的过程中,正好有另外一个端口发出同样的请求,我也要能
够在最短的时间内响应,按照我上面的程序结构,势必会让某些端口等待较长时间?
大家都说用多线程,我也觉得要用,只是怎样来组织,一时还想不清楚,大家给点意见啊
 
創建一個線程類, 把要處理的過程放到該類中,端口每发出一次请求,就調用該類一次,
 
顶部