天天看点

线程delphi

单元结构

Unit 后边跟的是单元的名称

相当于名称空间

Interface 相当于引入的基础的单元库,也就是名称空间库

Type 下边是定义的类或者数据结构。

举例说明:

线程第一种使用方法:

====================================================================

TReadThread=class(TThread)//解析数据表中接受到的数据

private

{Privatedeclarations}

procedureUpdateRead;

protected

procedureExecute;override;

public

constructor Create(CreateSuspended:Boolean);

end;

======================================================================

procedureUpdateRead;///这个是操作界面的

procedureExecute;override;///这个是后台执行的

constructor Create(CreateSuspended:Boolean);///这个是创建线程类句柄的

上边是类结构体

Var 实现的是声明整个单元的变量和过程函数

Implementation

后边是具体的

过程函数

uses 是过程和函数用的单元。

上边所有的声明的过程和函数的具体的内容

并具体所有类的函数或者过程

其中有关声明的过程和实际的过程体的标识问题。是全局的还是怎样的?

创建线程类实例方法:

constructor TReadThread.Create(CreateSuspended:Boolean);

begin

ThredRun:=1;//标注线程创建

ReadKX:=0;//空闲次数

FreeOnTerminate:=true;//退出时释放

inherited Create(CreateSuspended);//可暂停的方式

==============================================================================

创建执行后台执行的代码:

procedure TReadThread.Execute;

var 

i:Integer;

begin 

{Placethreadcodehere}

whileReadKX<3 do//空闲次数不超过3次,连续读数据库超过3次无记录停止

if Terminatedthenbreak;//收到停止命令了退出

Synchronize(UpdateRead);//循环执行操作

sleep(200);

if(ReadKX>=3) and (ThredRun=1) then

// ReadThr.Suspend;//空闲挂起等待

ReadThr.Terminate;//结束

ThredRun:=0;

===============================================================================

下边是具体的操作的:通过使用synchronize()解决这个问题

procedureTReadThread.UpdateRead;

var

OneData,v_sql,v_str:string;

adoq,adom,adon,ADOT:TADOQuery;

s_jzq,s_jzqname,s_xqnum,s_xqname,s_zhcode,s_zhfj,s_zhb,s_date,s_jzqxh,s_lhnum:string;

s_isic:string;

v_temp1,v_temp2,v_temp3,v_temp4:string;

i_mllx,v_gswd,v_hswd:Integer;//命令类型供回水

v_nd,v_ksrq,v_jsrq:string;//设采暖期年度,时间

v_bgz,v_bgzxx:string;//故障值

v_temr,v_dtemp:string;

// 读取数据库如果不为空执行解析操作

ADOQ := TADOQuery.Create(Nil);

ADOQ.Connection := DM.con;

ADOm := TADOQuery.Create(Nil);

ADOm.Connection := DM.con;

ADOn := TADOQuery.Create(Nil);

ADOn.Connection := DM.con;

ADOT := TADOQuery.Create(Nil);

ADOT.Connection := DM.con;

v_sql:='select top 100 * from DM_Read where IsJx=0 order by id ';

Execsql(ADOQ,v_sql,true);

if adoq.RecordCount>0 then

ReadKX:=0;

adoq.First;

while not adoq.Eof do

//循环解析查询到的数据

s_jzq:=adoq.Fieldbyname('jzqnum').AsString;

v_SQL:='select * from View_CollectInfo where FactoryCode=''01'' andCollectCode='''+s_jzq+'''';

Execsql(adom,v_sql,true);

if adom.RecordCount>0 then

s_xqnum:= adom.Fieldbyname('CommunityCode').AsString;

s_xqname:=adom.Fieldbyname('CommunityName').AsString;

s_jzqname:=adom.Fieldbyname('CollectName').AsString;

s_jzqxh:= adom.Fieldbyname('Model').AsString;

s_isic:=adom.Fieldbyname('isic').AsString;

s_date:= adoq.Fieldbyname('GetTime').AsString;

i_mllx:=adoq.Fieldbyname('mllx').AsInteger;

OneData:=adoq.Fieldbyname('Readtxt').AsString;

//为防止错误数据,先修改记录,后解析

v_sql:='updateDM_Read set isjx=1 where id='''+adoq.Fieldbyname('id').AsString+'''';

Execsql(ADOn,v_sql,false);

case i_mllx of

1: begin

//-----1----集中器表号设置发送开始 -----------------------

//回复:DCDC+集中器编号(4B) +和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 集中器开始初始化');

F_Main.mmo_m1.Lines.Add('小区:'+s_xqname+' 集中器:'+s_jzqname);

2: begin

//---*--2---开始发送表号--------------------------------------

//回复:DDDD+集中器编号(4B)+简码(2B)+ 表号(4B)+面积(3B)+房间号(4B)+和校验(1B)+ED

//2012版+IC卡编号(4B)+单户表通断比比值系数(1B)+系统保留字(4B)+

s_zhb:= copy(OneData,17,8) ;

v_SQL:='select * from View_HouseInfo whereFactoryCode=''01'' andCollectCode+MeterCode='''+s_jzq+s_zhb+'''';

s_zhcode:=adom.Fieldbyname('CardRoom').AsString;

s_zhfj:=adom.Fieldbyname('BuildCode').AsString+'-'+adom.Fieldbyname('UnitCode').AsString+'-'+adom.Fieldbyname('FloorCode').AsString+adom.Fieldbyname('RoomCode').AsString;

if CheckHtoM(onedata) then

//命令解析部分

v_sql:=' select * from DT_CollectInfo whereCollectCode='''+s_jzq+

''' and RoomSimCode='''+copy(onedata,13,4)+''' and MeterCode='''+

s_zhb+''' ';

execsql(adon,v_sql,true);

try

with adon do

if adon.RecordCount>0 then Edit

else insert;

fieldbyname('CollectCode').Value:=s_jzq;

fieldbyname('MeterCode').Value:=s_zhb;

fieldbyname('RoomSimCode').Value:=copy(onedata,13,4);

fieldbyname('HeatingArea').Value:=StrToInt(copy(onedata,25,6))/100;

fieldbyname('RoomCode').Value:=copy(onedata,31,8);

if (s_jzqxh='2011') and (s_isic='1') then//2011年IC卡得ICnum

fieldbyname('ICCode').Value:=copy(onedata,39,8);

if s_jzqxh>='2012' then//2012年添加改动初始化表

fieldbyname('jlxs').Value:=strtoint(copy(onedata,47,2))/10;

fieldbyname('bl').Value:=copy(onedata,49,8);

post;

except

adoq.Next;

Continue;

3: begin

//-----3-------集中器表号设置发送完成 -----------------------

//回复:DCDB+集中器编号(4B)+表总数(2B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 集中器初始化完成');

4:begin

//---*---4------初初始化单表完成--------------------------------

//回复:DDAA +集中器编号(4B)+简码(2B)+ 表号(4B)+面积(3B)+房间号(4B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回初始化单表命令') ;

F_Main.mmo_m1.Lines.Add('小区:'+s_xqname+' 房间号:'+s_zhfj);

5:begin

//=======5==========写集中器各表热量命令=====================

//回复:AABA+集中器编号(4B)+表号(4B)+热量(4B)+和校验(1B)+ED

s_zhb:= copy(OneData,13,8) ;

v_sql:=' select * from DT_IniHeat where CollectCode='''+

s_jzq+''' and MeterCode='''+s_zhb+''' ';

fieldbyname('Cardroom').Value:=s_zhcode;

fieldbyname('MeterHeat').Value:=StrToInt(copy(onedata,21,8))/100;

6:begin

//---------6--------写集中器各表热量完成 -----------------------

//回复: AABB+集中器编号(4B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回集中器写热完成命令') ;

7:begin

//=======7==========写集中器单表热量命令=====================

//回复: AABC +集中器编号(4B)+简码(2B)+ 表号(4B)+单表热量(4B) +和校验

F_Main.mmo_m1.Lines.Add(s_date+' 返回单表写热量命令') ;

8: begin

//-------8-----上位机控制温控器是否显示热量---------------------

//回复: CCBB +集中器号(4B)+温控器热状态(1B: 00:不显示;02:显示)+校验位+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置温控器显热命令') ;

F_Main.mmo_m1.Lines.Add('小区:'+s_xqname+'集中器:'+s_jzqname);

v_sql:=' select top 1 * from T_dzbd where CollectCode='''+

s_jzq+''' order by id ';

fieldbyname('FactoryCode').Value:='01';

if Copy(onedata,13,2)='00' then

fieldbyname('Collectcs').Value:='0'

else fieldbyname('Collectcs').Value:='1';

9:begin

//-----9-----返回集中器群表设温各表回复------------------------------

//回复:DAAB +集中器号(4B)+表号(4B)+校验位+ED

v_sql:=' select * from DT_jzqsw where CollectCode='''+

fieldbyname('RoomSimCode').Value:=adom.Fieldbyname('RoomSimCode').AsString;

end

else

v_sql:='insert into DT_BadMeterInfo (FactoryCode,CollectCode,MeterCode,CardRoom,BadTime,BadRea) values ( ''01'','''+

s_jzq+''','''+s_zhb+''','''+s_zhcode+''','''+

s_date+''','''+'集中器群表设温错误'+''')';

execsql(adon,v_sql,false);

10: begin

//----10-----------发送集中器设温完成回复 ------------------------------

//回复: DAAC +集中器编号(4B) +校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回集中器设温完成命令') ;

11:begin

//-----11-----返回集中器单表设温各表回复------------------------------

//回复:DAAA +集中器号(4B)+表号(4B)+校验位+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回集中器单表设温命令') ;

s_date+''','''+'集中器单表设温错误'+''')';

12: begin

//----12------------------发送集中器校时完成------------------------------

//回复:BDBC+集中器号码(4B)+[年月日时分秒(6B)]+校验和(1B)+ED

//F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器校时完成命令') ;

//F_Main.mmo_m1.Lines.Add('小区:'+s_xqname+' 集中器:'+s_jzqname);

13: begin

//----13-----------------发送集中器各表校时完成------------------------------

//回复:BDBD+集中器号码(4B)+表号(4B)+校验和(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器单表校时完成命令') ;

v_sql:=' select * from DT_ConTimTh where CollectCode='''+

s_date+''','''+'集中器单表校时错误'+''')';

14:begin

//----14-----------发送集中器校时,总表回复 ------------------------------

//回复:AAAD+集中器号码(4B)+表号(4B)+校验和(1B)+ED

15:begin

//----15------------发送集中器校时,完成回复 ------------------------------

//回复:BDBB+集中器编号(4B) +校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器校时完成命令') ;

16:begin

//----16------------发送集中器清零,集中器回复 -----------------

//回复:AAAB+集中器号码(4B)+校验和(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器清零完成命令') ;

v_sql:=' select top 1 * from DT_dzbd where CollectCode='''+

fieldbyname('Collectcs').Value:='1';

17:begin

//----17------------发送集中器清零,总表回复 --------------------------

//回复:AAAC+集中器号码(4B)+总表+校验和(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器总表清零完成命令') ;

18:begin

//----18------------发送设置采暖期时间集中器回复-----------------------

//回复:DBCB+集中器号(4B)+开始月日(2B)+结束月日(2B)+校验位+ED

// 2012增加开始月日(2B)+结束月日(2B)

F_Main.mmo_m1.Lines.Add(s_date+' 返回集中器设采暖期命令') ;

19:begin

//----19-------------发送集中器各表设置采暖季时间回复--------------

//回复:DBCA +集中器号(4B)+表号(4B)+起始月日(2B)+结束月日(2B) +校验和(1B)+ED

v_SQL:='select * from View_HouseInfo whereFactoryCode=''01'' and CollectCode+MeterCode='''+s_jzq+s_zhb+'''';

v_sql:=' select * from DT_HeatPerSet where CollectCode='''+

v_sql:='select top 1 * from DE_HeatPerSet order by Year desc ';

execsql(adot,v_sql,true);

if adot.recordcount>0 then

v_nd:= adot.Fieldbyname('Year').AsString;

v_ksrq:=adot.Fieldbyname('StartDate').AsString;

v_jsrq:=adot.Fieldbyname('EndDate').AsString;

fieldbyname('CardRoom').Value:=s_zhcode;

fieldbyname('RoomSimCode').Value:=adom.Fieldbyname('fjjm').AsString;

fieldbyname('SetTime').Value:=s_date;

fieldbyname('Year').Value:=v_nd;

fieldbyname('StartDate').Value:=v_ksrq;

fieldbyname('EndDate').Value:=v_jsrq;

s_date+''','''+'集中器群表设采暖期错误'+''')';

20:begin

//----20-------------发送单表设置采暖季时间完成----------------------

//回复:DBBA+集中器号(4B)+表号(4B)+起始月日(2B)+结束月日(2B) +校验和(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回单表设采暖期命令') ;

v_sql:=' select * from T_xqcnq where jzqnum='''+

s_jzq+''' and zhbnum='''+s_zhb+''' ';

s_date+''','''+'集中器单表设采暖期错误'+''')';

21:begin

//----21-------------发送设置采暖期时间完毕比对--------------------

//回复:DBAA+集中器号(4B)+校验位+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置集中器设采暖期完成命令') ;

22: begin

//----22------------发送下传单表通断时间完成-------------------------

//回复:BABA +集中器编号(4B)+表号(4B)+接通时间(3字节BCD,高字节在前)+断开时间(3字节BCD,高字节在前)+

//锁闭时间(3字节BCD,高字节在前)+ 校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回下传单表通断时间命令') ;

v_sql:=' select * from DT_IniRatio where CollectCode='''+

fieldbyname('RoomSimCode').Value:=adom.fieldbyname('RoomSimCode').AsString;

fieldbyname('TurnonTime').Value:=strtoint(Copy(OneData,21,6))/100;

fieldbyname('OffTime').Value:=strtoint(Copy(OneData,27,6))/100;

fieldbyname('LockTime').Value:=strtoint(Copy(OneData,33,6))/100;

23: begin

//----*--23-----------处理单表即时数据信息----------------------------

//回复:AAAA+小区集中器号(4b)+户表号(4B)+热量(4B)+年度比值3(3B)+供水温度(1B)+

//回水温度(1B)+。。。。。。。 +校验位+ED(结束符)

F_Main.mmo_m1.Lines.Add(s_date+' 返回单表即时数据命令') ;

//数据解析过程

v_sql:=' select * from DM_HouseData where1=2 ' ;

{ v_sql:=' select * from DM_HouseData whereCollectCode='''+

s_jzq+''' and CardRoom='''+s_zhcode+

''' and substring(GetTime,1,10)='''+copy(s_date,1,10)+'''' ;

}

// if adon.RecordCount>0 then Edit

//else

insert;

fieldbyname('GetTime').Value:=s_date;

fieldbyname('CaloHeat').Value:=strtoint(copy(onedata,21,8))/100;

fieldbyname('Ratio').Value:=strtoint(copy(onedata,29,6))/100000;

fieldbyname('WarterT').Value:=strtoint(copy(onedata,35,2));

fieldbyname('RWarterT').Value:=strtoint(copy(onedata,37,2));

fieldbyname('TPoor').Value:=abs(strtoint(copy(onedata,37,2))-strtoint(copy(onedata,35,2)));

if copy(onedata,39,2)='55' then

fieldbyname('CaloLock').Value:=1;

fieldbyname('VStatus').Value:=1;

fieldbyname('CaloLock').Value:=0;

fieldbyname('VStatus').Value:=0;

if s_jzqxh>='2011' then////是2011年版的,才有这个解析

fieldbyname('TurnTime').Value:=strtoint(copy(onedata,39,6))/100;

fieldbyname('OffTime').Value:=strtoint(copy(onedata,45,6))/100;

v_bgz:= IntToBin(strtoint(copy(onedata,51,4)),7) ;

v_bgzxx:='';

fieldbyname('FaultNo').Value:=v_bgz ;

if Copy(v_bgz,8,1)='1' then fieldbyname('gz1').Value:='温控器失联 ' else fieldbyname('gz1').Value:='';

if Copy(v_bgz,7,1)='1' then fieldbyname('gz2').Value:='锁闭回温接近总表回温 ' else fieldbyname('gz2').Value:='';

if Copy(v_bgz,6,1)='1' then fieldbyname('gz3').Value:='锁闭供温接近总表供温 ' else fieldbyname('gz3').Value:='';

if Copy(v_bgz,5,1)='1' then fieldbyname('gz4').Value:='锁闭室温高 ' else fieldbyname('gz4').Value:='';

if Copy(v_bgz,4,1)='1' then fieldbyname('gz5').Value:='开启且接通供温低 ' else fieldbyname('gz5').Value:='';

if Copy(v_bgz,3,1)='1' then fieldbyname('gz6').Value:='开启且接通回温低 ' else fieldbyname('gz6').Value:='';

if Copy(v_bgz,2,1)='1' then fieldbyname('gz7').Value:='开启且接通供回水温差小 ' else fieldbyname('gz7').Value:='';

if Copy(v_bgz,1,1)='1' then fieldbyname('gz8').Value:='开启且接通室温低 ' else fieldbyname('gz8').Value:='';

fieldbyname('SetT').Value:=strtoint(copy(onedata,55,4))/100;

fieldbyname('RoomT').Value:=strtoint(copy(onedata,59,4))/100;

fieldbyname('CaloLock').Value:=strtoint(copy(onedata,63,2));

fieldbyname('VStatus').Value:=strtoint(copy(onedata,65,2));

fieldbyname('BatStatus').Value:=strtoint(copy(onedata,67,2));

fieldbyname('LockTime').Value:=strtoint(copy(onedata,69,6))/100;

fieldbyname('CumuATSet').Value:=strtoint(copy(onedata,75,4))/100;

fieldbyname('CumuAInT').Value:=strtoint(copy(onedata,79,4))/100;

fieldbyname('CycleAInT').Value:=strtoint(copy(onedata,83,4))/100;

fieldbyname('CycleAWT').Value:=strtoint(copy(onedata,87,2));

fieldbyname('CycleARwT').Value:=strtoint(copy(onedata,89,2));

fieldbyname('CalosSte').Value:=strtoint(copy(onedata,91,2));

fieldbyname('ForcedRoomT').Value:=strtoint(copy(onedata,93,3))/10;

v_temr:=inttobin(strtoint(copy(onedata,96,1)),4);

v_temr:= Copy(v_temr, Length(v_temr)-1,2);

fieldbyname('IS_EffecForce').Value:=strtoint(Copy(v_temr,2,1));

fieldbyname('isxr').Value:=strtoint(Copy(v_temr,1,1));

//if length(onedata)>100 then

//fieldbyname('zqswsj').Value:=strtoint(copy(onedata,97,10))/10;//2011 非IC卡得

v_dtemp:=copy(onedata,105,2) ;//2011 IC卡得

if v_dtemp='01' then

fieldbyname('issk').Value:= 1 ;

// Changezhbzt(v_str1,v_str2,v_str3);

else fieldbyname('issk').Value:=0;

if length(onedata)>112 then

fieldbyname('zqswsj').Value:=strtoint(copy(onedata,107,10))/10;

if s_jzqxh>='2012' then

fieldbyname('ndczr').Value:=strtoint(copy(onedata,117,8))/100;

v_dtemp:=copy(onedata,125,2) ;

v_temp1:= copy(onedata,127,6)+'.'+copy(onedata,133,2) ;

if v_dtemp='01' then//

fieldbyname('ndsyr').Value:='-'+v_temp1

else fieldbyname('ndsyr').Value:=v_temp1;

fieldbyname('fmtdcs').Value:=strtoint(copy(onedata,135,6));

fieldbyname('tdbzxs').Value:=strtoint(copy(onedata,141,2))/10;

fieldbyname('xtblz').Value:= copy(onedata,143,8) ;

if ((strtoint(copy(onedata,37,2))=0) and (strtoint(copy(onedata,35,2))=0)) then

s_date+''','''+'集中器单表通讯断开'+''')';

24:begin

//------ 24----------取集中器总表数据完成--------------------------

//回复:CBCB+小区集中器编号(4B)+累积热量(5B)+累积流量(4B)+进水温度(2B)+

//回水温度(2B)+瞬时流量(3B)+总表热量状态(1B)+校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回总表要数命令') ;

v_sql:=' select * from DM_BigMeterData where 1=2 ';

{ v_sql:=' select * from DM_BigMeterData whereCollectCode='''+

s_jzq+ ''' and substring(GetTime,1,10)='''+copy(s_date,1,10)+'''' ;

// else

fieldbyname('CommunityCode').Value:=s_xqnum;

fieldbyname('BigMeterCode').Value:='00000000';

fieldbyname('CumuHeat').Value:=StrToInt(Copy(onedata,13,10));

fieldbyname('CumuF').Value:=StrToInt(Copy(onedata,23,8));

fieldbyname('WarterT').Value:=StrToInt(Copy(onedata,31,4));

fieldbyname('RWarterT').Value:=StrToInt(Copy(onedata,35,4));

fieldbyname('InstanF').Value:=StrToInt(Copy(onedata,39,6))/1000;

fieldbyname('DataState').Value:=StrToInt(Copy(onedata,45,2));

25:begin

//----25--取集中器总表数据完成-------2块表处理-------------------

//回复:CBCD+小区集中器编号(4B)+累积热量(5B)+累积流量(4B)+进水温度(2B)+回水温度(2B)+

26:begin

//---*--26--- ----处理集中器群表即时数据信息------------------------

// 回复:ACAC+集中器编号(4B)+住户表编号(4B)+热量(4B)+比值2(3B)+供水温度(1B)+回水温度(1B)+和校验(1B)+ED

{v_sql:=' select * from DM_HouseData whereCollectCode='''+

s_date+''','''+'集中器群表通讯断开'+''')';

v_sql:='insert into t_hbxx (jzqnum,zhbnum,zhcode,jlsj,jlyy) values ( '''+

s_date+''','''+'集中器群表即时数据错误'+''')';

27:begin

//-----27------------发送群表要数完毕完成 -------------------------------

//回复:ACDB+ 集中器编号(4B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回群表要数完成命令') ;

28:begin

//-----28-----------取分摊系数完成 -------------------------------

//回复:ACDD+ 集中器编号(4B)+分摊系数(1B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回取分摊系数命令') ;

F_Main.mmo_m1.Lines.Add('小区:'+s_xqname+' 集中器:'+s_jzqname+' 分摊系数:'+ copy(onedata,13,1)+'.'+copy(onedata,14,1));

fieldbyname('Collectcs').Value:=copy(onedata,13,1)+'.'+copy(onedata,14,1);

29:begin

//-----29------------设置分摊系数完成 -------------------------------

//回复:ACBD+ 集中器编号(4B)+分摊系数(1B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置分摊系数命令。') ;

30:begin

//-----30------------发送对单表的强制关断完成 -------------------------------

//回复:CCCC+小区编号+集中器编号(2B)+住户表编号(4B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回单表锁闭命令') ;

//修改表信息中的关闭信息

v_sql:=' update DE_HouseInfo set ISLock=1 whereCollectCode='''+

s_jzq+''' and MeterCode=''' +s_zhb+''' and CardRoom='''+s_zhcode+''' ';

execsql(ADOn,v_sql,false);

v_sql:='insert into DT_ConACMTh (CollectCode,MeterCode,Cardroom,RoomSimCode,FactoryCode) values ( '''+

ADOm.fieldbyname('fjjm').AsString+''',''01'')';

s_date+''','''+'集中器单表锁闭错误'+''')';

31:begin

//-----31------------发送对单表的解除强制关断完成 -----------------

//回复:CCBD+小区编号+集中器编号(2B)+住户表编号(4B)+和校验(1B)+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回单表开启命令') ;

v_sql:=' update DE_HouseInfo set ISLock=0 whereCollectCode='''+

s_date+''','''+'集中器单表开启错误'+''')';

32:begin

//----32------------------发送开群表完毕比对------------------------------

//回复:FE+CCCB+集中器编号(4B) +校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回开群表完毕命令') ;

33:begin

//----33------------------发送关群表完毕比对------------------------------

//回复:FE+CCBA+集中器编号(4B) +校验和+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回关群表完毕命令') ;

34:begin

//----34---------调取测试集中器表号-----------------

//回复:FE+ DDAB +集中器编号(4B)+简码(2B)+ 表号(4B)+和校验(1B)+ED

35:begin

//----35--------调取集中器表号完成 -----------------------

//回复:DDAC +集中器号(4B)+ 表个数(2B)+校验位+ED

36:begin

//------36--------广播校时命令完成 -----------------------

//回复:AAAD +集中器号(4B)+ ...+校验位+ED

37:begin

38:begin

39:begin

40:begin

41:begin

//------41--------温控器显示剩余热量数据结束完成 -----------------------

//FECCBC +集中器号(4B)+ 年充值热/剩余热的状态(1B: 00:不显示;04:显示)+校验位+ED

F_Main.mmo_m1.Lines.Add(s_date+' 返回设置温控器显剩余热量命令') ;

if copy(onedata,13,2)='00' then

fieldbyname('jzqcs').Value:='0'

elsefieldbyname('Collectcs').Value:='1';

42:begin

//------42--------集中器设置采暖方式结束完成 -----------------------

//回复:FE+ CBAD +小区集中器号(4b)+采暖方式(1B BCD码:00:散热器方式;01:地暖方式;)+校验和+ed

F_Main.mmo_m1.Lines.Add(s_date+' 返回集中器设置采暖方式命令') ;

ifcopy(onedata,13,2)='01' then

v_dtemp:= '小区:'+s_xqname+'集中器:'+s_jzqname+' 采暖方式:'+copy(onedata,13,2)+' 地板采暖'

else v_dtemp:= '小区:'+s_xqname+'集中器:'+s_jzqname+' 采暖方式:'+copy(onedata,13,2)+' 散热器采暖';

F_Main.mmo_m1.Lines.Add(v_dtemp);

fieldbyname('Collectcs').Value:=copy(onedata,13,2);

ReadKX:=ReadKX+1;

ADOQ.Free;

ADOm.Free;

ADOn.Free;

ADOT.free;

================================

线程第二种使用方法:

Timer使用方法

声明线程句柄

hThread: THandle; {线程句柄}

{线程入口函数}

function MyThreadFun(p: Pointer): Integer; stdcall;

while True do {假如线程不挂起, 这个循环将一直循环下去}

num := Random(100);

Result := 0;

================

创建线程

+========

procedure TThreadSortForm.btn2Click(Sender: TObject);

ID: DWORD;

//线程句柄返回的是这个

hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);

=====================

激活线程

===================

procedure TThreadSortForm.btn3Click(Sender: TObject);

///操作创建了的线程激活线程

ResumeThread(hThread);

=======================

挂起线程

procedure TThreadSortForm.btn4Click(Sender: TObject);

///挂起线程

继续阅读