非常着急,而且实在没有办法了,翻了几天资料了(100分)

  • 主题发起人 zhangzhihui528
  • 开始时间
Z

zhangzhihui528

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个服务程序,我的程序采用bde的连接,定时访问数据库指定的表,根据表内字段的(command) 的不同,去做不同的处理,我程序采用的是多线程,下面是我的一个线程类:type Tseacheteletype = class(TTHREAD) //查询电话类型 (小灵通(预先付费,后付费),普通电话)
private
qurey97: tstoredproc;
qurey: tquery;
TTS: string;
phonenumber: string;
v_id: integer;
protected
procedure Execute;
override;
public
procedure GETTELETYPE(id: int64;
phone: string);
destructor Destroy;
override;
end;


destructor TSEACHETELETYPE.Destroy;
begin
qurey97.Free;
qurey.Free;
CoUnInitialize;
//必须使用
inherited;
end;

procedure TSEACHETELETYPE.Execute;
var thread1: threadrecord;
out_service: string;
begin
inherited;
try
try
freeonterminate := true;
thread1.threadname := '';
thread1.v_id := v_id;
CoInitialize(nil);
//必须使用
qurey97.ParamByName('in_dhhm').AsString := phonenumber;
qurey97.ExecProc;
if qurey97.ParamByName('v_ret').AsString = '0' then
//成功
begin
out_service := qurey97.ParamByName('out_service').AsString;
TTS := '查询成功';
qurey.ParamByName('tts').AsString := TTS;
qurey.ParamByName('spcode').AsString := out_service;
//电话类型
qurey.ParamByName('id').AsString := inttostr(v_id);
qurey.ExecSQL;
end
else
begin
out_service := qurey97.ParamByName('out_service').AsString;
TTS := '查询失败';
qurey.ParamByName('tts').AsString := TTS;
qurey.ParamByName('spcode').AsString := out_service;
qurey.ParamByName('id').AsString := inttostr(v_id);
qurey.ExecSQL;
end;
except
TTS := '对不起,系统忙';
qurey.ParamByName('tts').AsString := TTS;
qurey.ParamByName('spcode').AsString := '';
qurey.ParamByName('id').AsString := inttostr(v_id);
qurey.ExecSQL;
end;
finally
qurey.Close;
qurey97.Close;
frm_main.RemoveAThread(thread1);
if Terminated = True then
begin
self.Terminate;
end;
Destroy;
exitthread(0);
end;
end;

procedure TSEACHETELETYPE.GETTELETYPE(id: int64;
phone: string);
begin
phonenumber := phone;
v_id := id;
qurey97 := tstoredproc.Create(nil);
qurey97.DatabaseName := dm.new97db.DatabaseName;
qurey97.StoredProcName := 'PZ_GET_CRM10000';
qurey97.Params.CreateParam(ftstring, 'in_dhhm', ptinput);
qurey97.Params.CreateParam(ftstring, 'out_service', ptoutput);
qurey97.Params.CreateParam(ftstring, 'v_ret', ptoutput);
qurey := tquery.Create(nil);
qurey.DatabaseName := dm.Database.DatabaseName;
qurey.SQL.Text := ' update KNOWLEDGE_10001_calling set resulttts=:tts,spcode=:spcode,flag2=2 where id=:id';
end;

但是每执行一次内存都会增大.我不知道问题出在哪里?希望给我答案
 
你的destory应该不会执行到
你线程的写法也不太规范,你指定了FreeOnTerminate的话,就不用再写什么ExitThread(0)
而且在线程执行过程里判断线程是否结束也不现实
你试试直接将释放资源的写在Finally里,去掉那些
if Terminated = True then
begin
self.Terminate;
end;
 
if Terminated = True then
begin
self.Terminate;
end;
高,实在是高,self.terminate本来就是将terminated置为True啊。
见源码:
procedure TThread.Terminate;
begin
FTerminated := True;
end;
 
顶部