delphi编写winsocket的流程

delphi编写winsocket的流程

1、在窗体创建的时候启用动态连接库(引用winsock)

var aWSAData:TWSAData;

if WSAStartup($0101,aWSAData)<>0 then

begin

MessageBox(Handle,'不能启动winsock动态链接库!','错误',MB_OK);

Exit;

end;

2、然后启动监听线程

Lthread:=TListenthread.CreateIt(9002);

3、线程的构造函数

constructor CreateIt(port:integer); //创建线程端口//监听线程的构造方法

constructor TlistenThread.CreateIt(port:integer); //创建端口

begin

inherited create(true);

lisport:=port;

FreeOnTerminate:=true;

resume; //******唤醒线程 重(新)开(始),再继续;恢复;收回;【微软】继续执行 挂起的线程重新执行。

end;

4、线程的销毁函数

destructor destroy;override; //结束线程

destructor TlistenThread.destroy;

begin

if lissocket<>INVALID_SOCKET then

begin

//shutdown(lissocket,SD_BOTH);//中断连接,其实连接还存在。

closesocket(lissocket); //*********CloseSocket() 是用来关闭一个 Socket 的!

DebugMessage('Close Socket');

end;

inherited destroy;

end;

5、线程的execute方法

procedure Execute; override; //线程执行过程

procedure TlistenThread.Execute;

var acceptsocket:Tsocket;

sa:SOCKADDR_IN;

salen:integer;

tempthreadread:ThreadSocketRead;

begin

{ Place thread code here }

Lissocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);

//***********************************************************************************

{socket()系统调用,带有三个参数:

    1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),

      PF_INET6(IPv6)等

    2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,

      比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。

    3、参数protocol指定需要使用的协议。虽然可以对同一个协议

      家族(protocol family)(或者说通信域(domain))指定不同的协议

      参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于

      UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前

      两个参数使用默认的协议。}

//******************************************************************************

if lissocket=INVALID_SOCKET then

begin

DebugMessage('Create Socket Error');

exit;

end;

DebugMessage('Create Socket!'); //调用本单元的 DebugMessage方法 显示成功创建套接字

sa.sin_family:=PF_INET;

sa.sin_port:=htons(lisport);

sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY); //INADDR_ANY,表示本地计算机的默认IP地址

salen:=sizeof(sa);

//******************************************************************************

{ sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET

sin_port存储端口号(使用网络字节顺序)

sin_addr存储IP地址,使用in_addr这个数据结构

s_addr按照网络字节顺序存储IP地址

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

}

{ int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );

[参数]

s - 指向用Socket函数生成的Socket Descrīptor

addr - 指向Socket地址的指针

namelen - 该地址的长度.

[返回值]

当函数成功调用时返回0

调用失败时返回 SOCKET_ERROR

  }

//***********************************************************************************

if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then

begin

closesocket(lissocket);

DebugMessage('无法打开端口:'+inttostr(lisport));

exit;

end;

DebugMessage('listen on port:'+inttostr(lisport)); //调用本单元的 DebugMessage方法 显示连接的端口号

listen(lissocket,200);

//**********************************************

{socket 套接字,网络编程必用的

listen ()监听从服务器传来的接收数据

listen ()创建一个套接口并监听申请的连接.}

//*******************************************

while not terminated do

begin

acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。

DebugMessage('连接成功!');

if acceptsocket=INVALID_SOCKET then

begin

DebugMessage('接受Socket失败!');

continue;

end;

//调用 UnitSocketRead 方法块中的 ThreadSocketRead.CreateIt 方法 并且同时调用datamoudle的数据库连接控件的连接语句。

tempthreadread:=ThreadSocketRead.CreateIt(acceptsocket,Datamodule1.ADOConnection1.ConnectionString);

if tempthreadread<>nil then

begin

str:='New thread:'+IntToStr(tempthreadread.threadid);

synchronize(AddMes); //synchronize 时间同步 调用方法本模块的 AddMes方法

end

else

begin

closesocket(acceptsocket);

DebugMessage('创建执行线程失败!'); //调用本单元的 DebugMessage方法

end;

end;

closesocket(lissocket); //一个关闭套接口的方法

end;

6、实现多线程类

6.1、类的构造函数

//类的构造函数

constructor ThreadSocketRead.CreateIt(S:TSocket;Con:string);

begin

CoInitialize( nil ); //使用com对象必须要初始化 主要做Com相关资源的释放,清理 工作...

inherited Create(true);//继承tthread线程类的构造方法。

FreeOnTerminate:=True; //用于结束线程,设置FreeOnTerminate为True ,执行完成线程以后,你不想明确摧毁它。当FreeOnTerminate是假的,线程对象必须明确销毁应用程序代码。

peerSocket:=S;

FCon:=con;

debugList:=Tstringlist.create;

Suspended:=false;//线程类的一个属性 tthread property Suspended: Boolean read FSuspended write SetSuspended;

end;

6.2、//定义销毁类方法还没有写完.

destructor ThreadSocketRead.destroy;

begin

if peerSocket<>INVALID_SOCKET then closesocket(peerSocket);

Synchronize(removelist);

BCSample.Free;

if FAdoQuery<>nil then FAdoQuery.Free;

if (Fadoconnection<>nil)then

begin

if Fadoconnection.Connected then Fadoconnection.Close ;

Fadoconnection.Free;

end;

debugList.Free;

CoUnInitialize; //必须使用 主要做Com相关资源的释放,清理工作...

inherited destroy;

end;

6.3、多线程类的执行

procedure ThreadSocketRead.Execute;

var

btime:string;

size:integer;

timedif,blong1,ErrCode:integer; //timedif 时差 ErrCode 错误编码, blong1 程序执行时间。

label endp;

procedure Writelog;

begin

debugList.SaveToFile(BCSample.DebugFileName);

debugList.clear;

blong1:=Round((now-strtodatetime(btime))*SecsPerDay);

Fadoconnection.BeginTrans;

with Fadoquery do

begin

try

close;

sql.clear;

sql.Add('insert into T_FC_CallbackLog (FC_JCPointNo,FC_CBackTime,FC_CBackState,FC_Duration,FC_DataSize,TimeDiff)');

sql.add('values (:jcno,:btime,:state,:blong,:datasize,:timedif)');

Parameters.ParamByName('jcno').Value := BCSample.PointNo;

Parameters.ParamByName('btime').Value := btime;

Parameters.ParamByName('state').Value := Errcode;

Parameters.ParamByName('blong').Value := blong1;

Parameters.ParamByName('dataSize').Value := BCSample.DataSize;

Parameters.ParamByName('timedif').Value := timedif;

ExecSql;

Fadoconnection.CommitTrans;

Except

on e:Exception do Fadoconnection.RollbackTrans;

end;

end;

end;

//将设置ip失败的调查仪信息插入到数据库中

procedure WriteSetDeviceIPLog;

begin

blong1:=Round((now-strtodatetime(btime))*SecsPerDay);

with Fadoquery do

begin

try

close;

sql.clear;

sql.Add('insert into T_FC_SetDeviceIPLog (JCPointNO,TesterNO,CallbackTime,CallbackState,Duration)');

sql.add('values (:JCPointNO,:TesterNO,:btime,:state,:blong)');

Parameters.ParamByName('JCPointNO').Value := BCSample.PointNO;

Parameters.ParamByName('TesterNO').Value := BCSample.DeviceNO;

Parameters.ParamByName('btime').Value := btime;

Parameters.ParamByName('state').Value := Errcode;

Parameters.ParamByName('blong').Value := blong1;

ExecSql;

Except

on e:Exception do exit;

end;

end;

end;

begin

//这里面紧接着要写对数据包的处理。

btime:=datetimetostr(now);

if PeerSocket=INVALID_SOCKET then exit;

size:=SizeOf(SockAddrIn); //初始化。

getpeername(PeerSocket,SockAddrIn,size); //取得对等方的连接。

PeerIP:=inet_ntoa(SockAddrIn.sin_addr); //inet_ntoa()将网络地址转换成'.'点隔的字符串格式。

PeerPort:=ntohs(SockAddrIn.sin_port); //ntohs()将一个无符号短整形数从网络字节顺序转换为主机字节顺序。

DebugMessage('连接的ip:'+PeerIP+':'+'端口号'+inttostr(PeerPort));//把连接的信息打印出来

Synchronize(AddTolist);

//建立数据库的连接。

try

Fadoconnection:= Tadoconnection.Create(nil); //创建数据库连接控件。

Fadoconnection.ConnectionString:=FCon; //把连接数据库的字符串赋值。

Fadoconnection.LoginPrompt:=false;

Fadoconnection.KeepConnection:=true;

Fadoconnection.Connected:=true;

except

on e:EOleException do

begin

DebugMessage('数据库的连接出现问题 :'+e.message);

exit;

end;

end;

DebugMessage(PeerIP+'Connected to DB');

FAdoQuery:=TAdoQuery.Create(nil); //创建查询控件。

FAdoQuery.Connection:= Fadoconnection;

//下面将要创建 TBCSample类。

BCSample:=TBCSample.Create(Fadoconnection);

BCSample.SetSocket(PeerSocket); //进行套结字赋值。

BCSample.SetDebugList(debugList);

//

BCSample.CallTime:=FormatDateTime('YYYY-MM-DD hh:mm:ss',StrtoDateTime(btime)+11/24/60);

DebugMessage('################'+BCSample.CallTime);

{ if not BCSample.SetIdAndVer then //如果设置机器的设备号失败,则进行跳转。

if not BCSample.SetIdAndVer then goto endp;

DebugMessage('设置设备号成功'); }

ErrCode:=ciReadIdErr; //ciReadIdErr:=1 读ID错。

if not BCSample.ReadIdAndVer then //如果取得不到机器的设备号,则进行跳转。

if not BCSample.ReadIdAndVer then goto endp;

DebugMessage('接受成功,取得设备号'+BCSample.DeviceNO);

//上面可以接受到数据了

//取得了设备的编号,从数据库进行查询 取得设备的类型,状态,设备的工作站编号,及回传的id,如果为使用,并得到样本人的编号

if not BCSample.GetDeviceInfo then

begin

DebugMessage('ip:'+PeerIP+' port:'+inttostr(PeerPort)+' DeviceNO:'+BCSample.DeviceNO+' 没有该设备号!' );

BCSample.Tranfinish(Err_SetupER); //通讯成功,但连接设备的设置参数有问题。

goto endp;

end;

{********设备为使用状态*********}

if BCSample.OnDeviceStateNo='02' then

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' DeviceState: 运行');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 监测点编号:'+BCSample.PointNo);

Synchronize(UpdateDisply);

if BCSample.CheckChannelUpdate then

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道信息');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息清除!');

ErrCode:=ciClearFMErr; // ciClearFMErr=2; 清除FM调频频点出错。

//******清除设备调频频点信息FM******

if not BCSample.clearFMValue then

if not BCSample.clearFMValue then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息清除成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息写入!');

ErrCode:=ciWriteFMValueErr; //ciWriteFMValue=3; //写FM调频频点出错。

if not BCSample.writeFMValue then

if not BCSample.writeFMValue then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息写入成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息清除!');

ErrCode:=ciClearAMErr; //ciClearAMErr=4; //清除AM调频频点出错。

if not BCSample.clearAMValue then

if not BCSample.clearAMValue then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息清除成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息写入!');

ErrCode:=ciWriteAMValueErr; //ciWriteAMValue=5; //写AM调频频点出错。

if not BCSample.writeAMValue then

if not BCSample.writeAMValue then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息写入成功!');

if not BCSample.UpdateChannelLog then

if not BCSample.UpdateChannelLog then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 更新指定频道标记成功!');

end

else

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道未更改');

end;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪时钟!');

ErrCode:= ciReadDeviceTimeErr; //ciReadDeviceTimeErr=12; //读取设备时钟出错

if not BCSample.ReadDeviceTime then

if not BCSample.ReadDeviceTime then goto endp; //取得不了机器时钟,就没有意义,不用再往下进行。

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪时钟成功!');

timedif:=round((BCSample.Devicetime - now)*SecsPerDay); //*******取得时差*********

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 校验指定频道场强仪时钟!');

ErrCode:=ciWriteDeviceTimeErr; //ciWriteDeviceTimeErr=6; //写时钟出错。

if not BCSample.WriteDeviceTime then

if not BCSample.WriteDeviceTime then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 校验指定频道场强仪时钟完成!'); //

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道溢出标志!');

ErrCode:=ciGetFlowErr; //ciGetFlowErr=16; //读取溢出标志出错

if not BCSample.recordIsOverFlow then

if not BCSample.recordIsOverFlow then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道溢出标志完成!');

if BCSample.OnisSetTimeSpace = '1' then //指定频道或自动频道的间隔时长有变化。

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道或自动侦测监测间隔时长有变化!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长!');

ErrCode:=ciwriteWatchValidTimeErr; //ciwriteWatchValidTimeErr=7; //写循环监测时长出错

if not BCSample.writeWatchValidTime then

if not BCSample.writeWatchValidTime then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长完成!');

ErrCode:=ciISEQUAlAllChannelSearchIntervalaErr; //ciISEQUAlAllChannelSearchIntervalaErr:=25

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长!');

ErrCode:=ciwriteAllChannelSearchIntervalaErr; //ciwriteAllChannelSearchIntervalaErr:=18

if not BCSample.writeAllChannelSearchIntervala then

if not BCSample.writeAllChannelSearchIntervala then goto endp; //如果不能设置自动全频道循环监测间隔时长,则跳转

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长成功!');

end;

{

100108_ZZF_现在是监测完成自动回传

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传时间!');

ErrCode:=ciwriteBackTimeErr; //ciwriteBackTimeErr:=8; //写回传时间出错

if not BCSample.writeBackTime then

if not BCSample.writeBackTime then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道指定频道场强仪回传时间成功!');

}

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址!');

ErrCode:=ciSetDeviceIPErr; // ciSetDeviceIPErr=9; //设置ip地址出错

if not BCSample.SetDeviceIP then

begin

if not BCSample.SetDeviceIP then

begin

WriteSetDeviceIPLog; //写设置设备ip错误的日志信息。

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址失败!');

end

else

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');

end;

end

else

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');

end;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪数据!');

ErrCode:=ciReadWatchFSRecordErr; //ciReadWatchFSRecordErr=13; //读取场强数据出错

if not BCSample.ReadWatchFSRecord then

if not BCSample.ReadWatchFSRecord then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪数据成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清除指定频道场强仪数据!');

ErrCode:=ciClearWatchFSRecordErr; //ciClearWatchFSRecordErr=14; //清除场强仪数据出错

if not BCSample.ClearWatchFSRecord then

if not BCSample.ClearWatchFSRecord then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清除指定频道场强仪数据成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据到文件!');

ErrCode:=ciSaveFileErr; //保存文件出错

if not BCSample.SaveTvdata then

if not BCSample.SaveTvdata then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据到文件成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库!');

try

if not BCSample.WriteRecordtoDb then

if not BCSample.WriteRecordtoDb then

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库失败!')

else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!')

else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!');

except

on e:Exception do DebugMessage(e.Message);

end;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 开启自动侦测读场强功能');

ErrCode:=ciautoStartAllChannelSearchErr; //ciautoStartAllChannelSearchErr:=17

if BCSample.OnDeviceIsOpen='1' then

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测读场强功能以前已开启');

end

else

begin

if not BCSample.autoStartAllChannelSearch then //如果第一次没有开启,在执行一次

if not BCSample.autoStartAllChannelSearch then goto endp;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 开启自动侦测读场强功能成功!');

end;

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测循环监测间隔时长!');

ErrCode:=cireadAllChannelSearchIntervalaErr; //cireadAllChannelSearchIntervalaErr:=19

if not BCSample.readAllChannelSearchIntervala then

if not BCSample.readAllChannelSearchIntervala then goto endp; // 读取自动全频道循环监测间隔时长部成功则调转。 //

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测循环监测间隔时长成功!间隔:'+inttostr(BCSample.AllChanneljgtime));

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据是否溢出!');

ErrCode:=cirecordAllChannelIsOverFlowErr; //cirecordAllChannelIsOverFlowErr:=20

if BCSample.recordAllChannelIsOverFlow then

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据溢出!')

else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据没有溢出!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测频点数据!');

ErrCode:=ciReadAllChannelWatchFSRecordErr; //ciReadAllChannelWatchFSRecordErr:=21

if not BCSample.ReadAllChannelWatchFSRecord then

if not BCSample.ReadAllChannelWatchFSRecord then goto endp; // 读取侦测自动频点数据部成功 ,调转。

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测频点数据成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测数据大小: '+inttostr(BCSample.OnAllChannelRevContextSize));

if BCSample.OnAllChannelRevContextSize>0 then //如果全频道扫描的流大于零,接受数据后清空

begin

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据! ');

ErrCode:=ciclearAllChannelSearchRecordErr; //ciclearAllChannelSearchRecordErr:=22

if not BCSample.clearAllChannelSearchRecord then

if not BCSample.clearAllChannelSearchRecord then goto endp; //如果清除不了所有频道监测的的数据,则跳转

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据成功!');

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件!');

ErrCode:=ciSaveAllChannelTvdataErr; //ciSaveAllChannelTvdataErr:=23

if not BCSample.SaveAllChannelTvdata then

if not BCSample.SaveAllChannelTvdata then goto endp; //如果保存不了所有频道监测的的数据到文件,则跳转

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件成功!');

try

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库!');

ErrCode:=ciWriteAllChannelRecordtoDbErr; //ciWriteAllChannelRecordtoDbErr:=24

if not BCSample.WriteAllChannelRecordtoDb then

if not BCSample.WriteAllChannelRecordtoDb then

DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库失败!')

else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!')

else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!');

except

on e:Exception do DebugMessage(e.Message);

end;

end ;

end;

ErrCode:=Err_NONE; // Err_NONE=100 正确

endp:

BCSample.Tranfinish(ErrCode);

debugList.Add('Errcode: '+inttostr(Errcode));

debugList.Add('溢出标志: '+BCSample.flag);

debugList.Add('全频道溢出标志: '+BCSample.flag);

Writelog;

//BCSample.destroy;

end;

7、边边角角的信息

//存储信息

procedure ThreadSocketRead.DebugMessage(mes:string);

begin

if gdebug then

begin

inforStr:=mes;

synchronize(AddMes1);

end;

end;

//打印信息到formmain.memo

procedure ThreadSocketRead.AddMes1;

begin

if gdebug then

formmain.Memo.Lines.Add(FormatDatetime('hh:mm:ss',Now)+'-*-'+inforStr);

end;

procedure ThreadSocketRead.removelist;

begin

if not AppExit and (DeviceItem<>nil) then

begin

DeviceItem.Delete;

end;

end;