江湖救急!!关于多线程问题

liuhx1027 2005-08-27 03:24:32
我在用 delphi开发一个考试管理系统时使用到了多线程,第二个线程主要用于进行按条件从数据库中抽取试题,其中用到了数据库操作的一些ado组件,并且在抽题过程中会在主线程中显示进度,就是一个窗口,上面有个进度条的那种,在第二个线程中隔一断时间更新进度条的值,这一切都可以顺利进行,可当我关闭应用程序时确显示“无效的窗口句柄”,不知道是什么意思?如果我打开应用程序不进行抽题的话,也就是不运行第二个抽题线程的话这个错误信息就不显示了,不知道是哪里出了错误,请高手帮帮忙
...全文
139 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhx1027 2005-08-28
  • 打赏
  • 举报
回复
我检查了一下我的代码,除了创建组件是在用 query := Tadoquery.create(main); main 是主窗体的名字以外,其它代码都是一些数据库查询和插入更新操作,线程结束也并未释放任何组件,整个抽题是在一个线程类里面。下面是部分代码,请各位帮忙看一下:

TDistill = class(TThread)
function createtable(tabname:string):boolean;
procedure ShowMsg1;
procedure ShowMsg2;
procedure ShowMsg3;
private
tablename:string; // 抽题表
ProblemID:integer;//大题号
ID : integer ; //小题分布信息编号
TypeID:string;//题型编号
SubType :string;//子类型
pos:integer;
NO:integer; //小题号
Demand :string;//大题要求
Evalue :integer;//第道 小题的分值
query,data1query:TADOQuery;
connection:TADOconnection;
command:TADOcommand;
function distill():boolean;
procedure InsertRecord;//将 query数据集中第 t 条记录插入到指定表里面
procedure init;
{ Private declarations }
protected
procedure Execute; override;
public
table:string; //存放抽题题目的表
PaperID1:integer;//试卷号
TopicID1:string; //科目ID
PSum1:integer;
T_ID :string;//抽取试卷的编号
function distill_theme():boolean;//按照试卷编号为试卷抽取题目
constructor Create(TopicID:string;PaperID:integer;tablename:string;Psum:integer;connection1:TADOConnection);
{ Public declarations }
end;

constructor Tdistill.Create(TopicID:string;PaperID:integer;tablename:string;Psum:integer;connection1:Tadoconnection);
begin
inherited create(false);
TopicID1 := TopicID;
PaperID1 := PaperID;
table := tablename;
Psum1 := Psum;
connection := connection1;
FreeOnTerminate := true;
end;

procedure Tdistill.init;
begin
query := Tadoquery.Create(application); //初始化查询组件
//query.Connection := Connection;
data1query := Tadoquery.Create(application);
//data1query.Connection := Connection;
command := Tadocommand.Create(application);
end;

procedure Tdistill.execute;
var
i:integer;
begin
Synchronize(init);
query.Connection := connection;
createtable(table);
data1query.Connection := connection;
command.Connection := connection;

for i:=1 to Psum1 do
begin
T_ID := inttostr(i);
//函数distill_theme是抽取一份试卷的函数,成功返回true
if (not distill_theme()) or terminated then
begin
exit;
end;
//synchronize(showmsg2);
end;
//synchronize(showmsg3);
end;

因为初始化要访问主线程,所以我把它单独写成一个过程,以便用synchronize()调用,不知道这样对不对?

其它函数里面都是数据库操作的语句,也没有释放任何组件,不知道是哪里出了问题,望各位不吝赐教

WindYou 2005-08-27
  • 打赏
  • 举报
回复
在线程类的析构函数中不要释放任何资源,所有资源的释放在OnTerminate事件中释放
无风飞尘 2005-08-27
  • 打赏
  • 举报
回复
请确认一下是否存在下面情况:
你的线程里用到的东东,在线程执行完后释放了组件,但你退出程序时又再次地释放组件。
这样就出现你说的那个问题了。我估计你的问题是这样,如果不是请贴一点代码上来。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧