在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论