我创建了3个线程,但是在系统任务管理器中发现一共启动了16个线程,为什么?这种情况影响系统的稳定吗?如果不影响,为什么总是抱地址错误???各位:我很着急!!!谢谢大家
解决方案 »
- delphi中判断stringgrid中某列的值,大于0红色
- 想和你探讨一个纯学术上的问题!
- 在局域网中如何实时得知某台机器已经断开网络?
- 如何用DBEXPRESS处理SQLServer2000的临时表
- 升級QuickRep後不能打印指定的某一頁?
- 如何用程序检索网站上的ACCESS库中是否存在指定的记录?
- 在DELPHI6下怎样调用vb.net2.0下开发的控件
- 怎样用程序打开Treeview中指定的节点
- 请问怎么判断当前的操作系统是win95/98/Me/Nt/Xp?
- 高手请帮忙:如何使用nmsmtp控件发送带附件的HTML格式信件
- fastreport打印问题?
- 请问Delphi可以连Access一同打包起来在别的机器上运行吗?谢谢。
window2000AdvacedServer,可以打开任务管理器,然后在选择中可以设置。选择要查看的自定义信息。:)
___________________学了一招!!
CoInitialize(nil)CoUninitialize
因为我用的是BDE,没有用ADO,BDE速度快。
是不是这里出的问题?
BDE就不要写它了。好久没有用BDE了,BDE是自己作会话处理,我猜测那16个线程同BDE有关的。
Classes,AdoDb,SysUtils,DB,DBTables,QDialogs;type TExpDataThrd = class(TThread) //导库基类
private
{ Private declarations } FServ,FSpe,FYWSerName:string;
//FConn:TADOConnection;
FDB:TDatabase;
FDBName:string;
FLocalDb:TDatabase;
procedure SetField;
protected LocalQry,adsFilter,adsSYS_FILTER,adsSheet,OutAds:TQuery;
SourField,DesField:string;//源表sql,目的表sql
{构建一条最终的获得源库中故障时时信息的sql语句}
procedure consql;virtual;abstract;
{构建多条sql语句,插入ORIGFAULTJHJ表中}
procedure combinsql;virtual;abstract;
{对数据进行第一次的过滤,插入filterjhj表中}
procedure firstfilter;virtual;abstract;
{第三次过滤}
procedure intosheet;virtual;abstract;
procedure Execute; override;
//procedure exportdata;//virtual; //导库
function exportdata:boolean;
public
constructor Create(valServ, ValSpe,valYwSer: string;valDB,vaLocalDb:TDatabase);
property serv:string read FServ write Fserv; //存放数据库的odbc名
property Spe:string read FSpe write FSpe; //专业
property YWSerName:string read FYWSerName write FYWSerName; //运维库的dbname
property DB:TDatabase read FDB write FDB;
property DBName:string read FDBName write FDBName;
property LocalDb:TDatabase read FLocalDb write FLocalDb;
end; TJHJThrd=class(TExpDataThrd) //交换机类
private
now_date :string;
endsql:string;//取得源数据的sql
midtime:string; protected
{构建一条最终的获得源库中故障时时信息的sql语句}
procedure consql;override;
{构建多条sql语句,插入ORIGFAULTJHJ表中}
procedure combinsql;override;
{对数据进行第一次的过滤,插入filterjhj表中}
procedure firstfilter;override;
{第三次过滤}
procedure intosheet;override; end;
TPOWERThrd=class(TExpDataThrd) //交换机类
private
now_date :string;
endsql:string;//取得源数据的sql
midtime:string;
midnum:string; //临时序号
protected
{构建一条最终的获得源库中故障时时信息的sql语句}
procedure consql;override;
{构建多条sql语句,插入ORIGFAULTJHJ表中}
procedure combinsql;override;
{对数据进行第一次的过滤,插入filterjhj表中}
procedure firstfilter;override;
{第三次过滤}
procedure intosheet;override; end;
implementationuses uf_pub,ini_class;{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TExpDataThrd.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }{ TExpDataThrd }procedure TExpDataThrd.SetField;
var
//tmpAds:TADODataSet;
tmpAds:TQuery;
tmpsour,tmpdes,tmpsql:string;
stable,dtable:string;//源表名,目的表名
begin
//取得对应关系表中的原表,新表的字段
tmpsql:='SELECT * FROM T_DYGX WHERE BDEBM='''+FServ+''' ';
//showmessage(FLocalDb.DatabaseName);
tmpAds:=TQuery.Create(nil);
try
rsOpen(FLocalDb.DatabaseName,tmpAds,tmpsql);
except on e:exception do
begin
adderrorlog('ThrdClass',tmpsql,pchar(e.message));
ReRsopen(FLocalDb,tmpAds,'ywbsconn',tmpsql);
end;
end; if tmpAds.RecordCount>0 then
begin
stable:=tmpAds.fieldbyname('ykbm').AsString;
dtable:=tmpAds.fieldbyname('mdkbm').AsString;
tmpAds.First;
tmpsql:='';
tmpsour:='';
tmpdes:='';
while not tmpAds.Eof do
begin
//原表中取出的字段
tmpsour:=tmpsour+tmpAds.fieldbyname('YZDM').AsString+',';
//目的表的插入的字段
tmpdes:=tmpdes+tmpAds.fieldbyname('MZDM').AsString+',';
tmpAds.Next;
end;
tmpsour:=copy(tmpsour,0,length(tmpsour)-1);
tmpdes:=copy(tmpdes,0,length(tmpdes)-1);
//取得源表中的数据sql
if FSpe='LB01' then
begin
SourField:='SELECT '+QuotedStr(FSpe)+' as WHLB,'+QuotedStr(FServ)+' as DYXT,'+tmpsour+' FROM '+stable;
DesField:=' insert into '+dtable+' (XH,WHLB,DYXT,'+tmpdes+') '; end
else if FSpe='LB03' then
begin SourField:='SELECT '+tmpsour+' FROM '+stable;
DesField:=' insert into '+dtable+' (XH,'+tmpdes+') ';
end;
end
else
begin
msgbox('提示!','请检查对应关系表中是否添加了对应的字段信息!',tWarning);
exit;
end; if Assigned(tmpAds) then
FreeAndNil(tmpAds);
end;
constructor TExpDataThrd.Create(valServ, ValSpe,valYwSer: string;valDB,vaLocalDb:TDatabase);
begin
FServ:=valServ;
FSpe:=ValSpe;
FYWSerName:=valYwSer;
FDB:=valDB;
FDBName:=valDB.DatabaseName;
FLocalDb:=vaLocalDb;
if Assigned(LocalQry) then
FreeAndNil(LocalQry);
LocalQry:=TQuery.Create(nil); //combinsql 本地库用
LocalQry.Close;
LocalQry.DatabaseName:=vaLocalDb.DatabaseName; if Assigned(OutAds) then
FreeAndNil(OutAds);
OutAds:=TQuery.Create(nil);
OutAds.DatabaseName:=FDB.DatabaseName; //网管库用 if Assigned(adsFilter) then
FreeAndNil(adsFilter);
adsFilter:=TQuery.Create(nil); // 本地库用
adsFilter.DatabaseName:=vaLocalDb.DatabaseName; if Assigned(adsSYS_FILTER) then
FreeAndNil(adsSYS_FILTER);
adsSYS_FILTER:=TQuery.Create(nil); // 本地库用
adsSYS_FILTER.DatabaseName:=vaLocalDb.DatabaseName; if Assigned(adsSheet) then
FreeAndNil(adsSheet);
adsSheet:=TQuery.Create(nil); // 本地库用
adsSheet.DatabaseName:=vaLocalDb.DatabaseName; SetField;
FreeOnTerminate := True; inherited Create(false);
end;
function TExpDataThrd.exportdata:boolean;
begin
result:=false;
try
{Synchronize(consql);
Synchronize(combinsql);
Synchronize(firstfilter);
Synchronize(intosheet); }
consql;
combinsql;
firstfilter;
intosheet;
result:=true;
except on e:exception do
begin
adderrorlog('ThrdClass',FSpe+'失败',pchar(e.message));
result:=false;
end
end;end;procedure TExpDataThrd.Execute;
var
tmpbln:boolean;
begin
{ Place thread code here }
// while true do
while not Terminated do
begin
tmpbln:=exportdata;
if not tmpbln then
begin
sleep(6000);
end;
end;
end;
函数说明:构建一条最终的获得源库中故障时时信息的sql语句
参数说明:****************************************************}
procedure TJHJThrd.consql;
var
xsql:string;
endtime:string;
begin gNowTimeJHJ:=now;
endtime:=readinifile('TIMETXT.INI','nowtime'); midtime:=stepdatetime(endtime,timestep);
if StrToDateTime(midtime)>now then
begin
timestep:=30;
midtime:=FormatDateTime('yyyy-mm-dd hh:nn:ss',now);
end; while ((endtime='ERROR') or (length(endtime)<9)) do
begin
endtime:='';
endsql:='';
xsql:='select convert(varchar(8),getdate(),112)+'' ''+convert(varchar(8),getdate(),108)';
try
OutAds.Close;
rsOpenThrd(DBName,OutAds,xsql);
except on e:exception do
begin
OutAds.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReRsopen(DB,OutAds,'jhjconn',xsql);
end;
end; writeinifile('TIMETXT.INI','nowtime',OutAds.Fields[0].AsString);
endtime:=readinifile('TIMETXT.INI','nowtime');
end;
endsql:=SourField+' WHERE occur_time>'''+endtime+''' and occur_time<='''+midtime+''' '+
' order by occur_time asc';
gNowTimeJHJ:=now;end;{***************************************************
函数说明:构建多条sql语句,插入ORIGFAULTJHJ表中
参数说明:
***************************************************}
procedure TJHJThrd.combinsql;
var
xsql:string;
j,step,step1:integer;
ddatestr:string;//starttime,系统启动时间,endtime记录一次取数据的终止时间 teststr:string;
tempxh:integer;
begin gNowTimeJHJ:=now;
//删除故障表1中的旧的数据
xsql:='delete from ORIGFAULTJHJ';
try
LocalQry.Close;
ExecSql(FLocalDb.DatabaseName,LocalQry,xsql); except on e:exception do
begin
LocalQry.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
end;
end; //取的源表的数据集
LocalQry.SQL.Clear;
try
OutAds.Close;
rsOpenThrd(DBName,OutAds,endsql); except on e:exception do
begin
OutAds.Close;
adderrorlog('ThrdClass',endsql,pchar(e.message));
ReRsopen(DB,OutAds,'jhjconn',endsql);
end;
end; gNowTimeJHJ:=now;
step:=0;
step1:=1;
OutAds.First;
//生成自动的序号
tempxh:=NewXH(FLocalDb.DatabaseName,'ORIGFAULTJHJ','XH');
while not OutAds.Eof do
begin
while ((step1<>0) and (not OutAds.Eof)) do
begin
//取得目的库的字段名
ddatestr:='';
for j:=0 to OutAds.FieldCount-1 do
begin
if OutAds.Fields[j].IsNull then
begin
ddatestr:=ddatestr+'null' +',';
end
else
begin
teststr:=stringreplace(OutAds.Fields[j].AsString,'''','◎',[rfReplaceAll]);
ddatestr:=ddatestr+''''+teststr+'''' +',';
end;
end;
ddatestr:=copy(ddatestr,0,length(ddatestr)-1);
//拼总的sql语句
xsql:=DesField+' VALUES ('+IntToStr(tempxh)+','+ddatestr+') ';
LocalQry.SQL.Add(xsql);
step:=step+1;
step1:= step mod 50;
OutAds.Next;
tempxh:=tempxh+1;
end; try
LocalQry.Close;
ExecSql(FLocalDb.DatabaseName,LocalQry,LocalQry.SQL.Text);
except on e:exception do
begin
LocalQry.Close;
adderrorlog('ThrdClass',LocalQry.SQL.Text,pchar(e.message));
ReExecSql('ywbsconn',FLocalDb,LocalQry,LocalQry.SQL.Text);
end;
end;
LocalQry.SQL.Clear;
step1:=1; end;
OutAds.Close;
LocalQry.Close;
if timestep>10 then
begin
if step>100 then timestep:=timestep-10
else
if step<95 then timestep:=timestep+15;
end;
writeinifile('TIMETXT.INI','nowtime',midtime);
gNowTimeJHJ:=now;end;
procedure TJHJThrd.firstfilter;
var
xsql:string;
tempXH:string;
begin
//KillLock(gDb.DatabaseName,LocalQry,adsFilter);//杀锁
gNowTimeJHJ:=now;
//1:翻译,补足原始故障信息当中的设备名称,设备类型
xsql:=' update ORIGFAULTJHJ '+
' set ORIGFAULTJHJ.SBMC=DATA_SWITCH.SW_CH_NAME, '+
' ORIGFAULTJHJ.SBLX=DATA_SWITCH.SWITCH_KIND '+
' FROM ORIGFAULTJHJ,DATA_SWITCH '+
' where '+
' ORIGFAULTJHJ.BYC1 IS NULL '+
' AND ORIGFAULTJHJ.SBBH=DATA_SWITCH.SWITCH_ID';
try
LocalQry.Close;
ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
except on e:exception do
begin
LocalQry.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
end;
end;
//2:删除FILTERJHJ表中的数据以便当次使用
xsql:='DELETE FROM FILTERJHJ ';
try
LocalQry.Close;
ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
except on e:exception do
begin
LocalQry.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
end;
end;
//3:取得最小的记录集数据的序号
xsql:=' select MIN(JHJ.XH) XH,JHJ.SBBH,JHJ.GJZ,JHJ.GZLX,JHJ.JYCD,JHJ.GZDW '+
' from ORIGFAULTJHJ JHJ '+
' group by JHJ.SBBH,JHJ.GJZ, JHJ.GZLX,JHJ.JYCD,JHJ.GZDW '+
' order by XH ';
try
adsSYS_FILTER.Close;
rsOpenThrd(FLocalDb.DatabaseName,adsSYS_FILTER,xsql);
except on e:exception do
begin
adsSYS_FILTER.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReRsopen(FLocalDb,adsSYS_FILTER,'ywbsconn',xsql);
end;
end; adsSYS_FILTER.First;
while not adsSYS_FILTER.Eof do
begin
tempXH:=adsSYS_FILTER.fieldbyname('XH').AsString;
xsql:=' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
' from ORIGFAULTJHJ JHJ,THESAURUS,DATA_SWITCH SWITCH '+
' WHERE JHJ.GJZ=THESAURUS.ORG_CLASS'+
' and JHJ.GZLX=THESAURUS.ALARMTYPE'+
' and JHJ.JYCD=THESAURUS.ALARMLVL'+
' and JHJ.XH='+tempXH+
' and SWITCH.SWITCH_KIND=THESAURUS.DEVICEID'+
' and JHJ.SBBH=SWITCH.SWITCH_ID';
try
adsFilter.Close;
rsOpenThrd(FLocalDb.DatabaseName,adsFilter,xsql);
except on e:exception do
begin
adsFilter.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReRsopen(FLocalDb,adsFilter,'ywbsconn',xsql);
end;
end;
xsql:='';
if adsFilter.IsEmpty then
begin
xsql:='INSERT INTO FILTERJHJ(DYXT,WHLB,XH,GZBM,JYCD,GZMS,GJZ,GZDW,SJ,SBBH,GZLX,SBLX,SBMC)'+
' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
' from ORIGFAULTJHJ JHJ WHERE JHJ.XH='+tempXH;
end
else
begin
//4:插入到FILTERJHJ表中以供T_SBGZXX表使用
xsql:='INSERT INTO FILTERJHJ(DYXT,WHLB,XH,GZBM,JYCD,GZMS,GJZ,GZDW,SJ,SBBH,GZLX,SBLX,SBMC)'+
' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
' from ORIGFAULTJHJ JHJ,THESAURUS,DATA_SWITCH SWITCH '+
' WHERE '+
' THESAURUS.ISFILTER=''是'' '+
' and JHJ.GJZ=THESAURUS.ORG_CLASS'+
' and JHJ.GZLX=THESAURUS.ALARMTYPE'+
' and JHJ.JYCD=THESAURUS.ALARMLVL'+
' and JHJ.XH='+tempXH+
' and SWITCH.SWITCH_KIND=THESAURUS.DEVICEID'+
' and JHJ.SBBH=SWITCH.SWITCH_ID';
end;
try
LocalQry.Close;
ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
except on e:exception do
begin
LocalQry.Close;
adderrorlog('ThrdClass',xsql,pchar(e.message));
ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
end;
end;
adsSYS_FILTER.Next;
end; gNowTimeJHJ:=now;end;