使用多线程的大部分时间运行正常,但偶尔出现异常:Thread Error: 句柄无效。 (6),这是什么原因?(100分)

  • 主题发起人 主题发起人 lixiaohui
  • 开始时间 开始时间
L

lixiaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
constructor TSendThread.Create(myclass:TObject);
begin
FQry := TADOQuery.Create(nil);
FQryTmp := TADOQuery.Create(nil);
FQryTmp1 := TADOQuery.Create(nil);
FQryTmp.Connection := frmmain.con ;
FQryTmp1.Connection := frmmain.con;
FQry.Connection := frmmain.con;
EnterCriticalSection(CS);
inc(NowThreadNum);
LeaveCriticalSection(CS);
tmpSmsRecordObj:=string(myclass);
inherited Create(false);
end;

destructor TSendThread.Destroy;
begin
FQry.Close;
FQry.Free;
FQryTmp.Free;
FQryTmp1.Free;
EnterCriticalSection(CS);
dec(NowThreadNum);
if NowThreadNum<0 then
NowThreadNum:=0;
LeaveCriticalSection(CS);
waitfor;
inherited;
end;

procedure TSendThread.Execute;
begin
inherited;
FreeOnTerminate:=true;
StartExecute;
end;
 
好像代码没有问题
 
使用ado要初始化,退出的时候也要做相应的处理的.
 
ado要初如化是什么意思?如何初化化?
 
你的程序应该是作为服务程序长时间不停的在运行吧。Delphi写的程序好象有这个缺点,你用VC应该没有这个问题
 
不是DELPHI的问题,有可能是你线程执行时占用的时间比较长,而没有运行完就收到退出命令了,你在线程退出时搞一个来回通知,就是两个EVENT,主线程需要子线程退出的时候通知子线程,子线程退出完后通知主线程。
InterlockedIncrement,InterlockedDecrement,可以少写一些代码
 
请火山详细讲一下,有时间的话发到我的信箱里面
muhx1981@126.com
谢谢:)
 
呵呵,你问就告诉你吧,给你发了一个程序,CollectAgent单元里就有,别的都不是。有时间给我点分啊,我也找找排名靠前的感觉
 
火山说的对,建议你在程序中使用
if abort then
break;
 
后退
顶部