用多线程查询数据库,关闭窗体时出现错误:在异步运行时,操作不能被执行(200分)

  • 主题发起人 xiaqiapeng
  • 开始时间
X

xiaqiapeng

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中一窗体使用线程查询数据库,
运行到一半,我终止了该线程,但是关闭窗体时出现错误:在异步运行时,操作不能被执行。
有人知道是什么原因吗?
代码如下:
1.启动线程
procedure TForm1.Button1Click(Sender: TObject);
begin
myThread1:=TThread1.Create(false);
while (myThread1.isfinish=false)do
begin
progressbar1.Position:= progressbar1.Position+1;
if progressbar1.Position=100 then
progressbar1.Position:=0;
Application.ProcessMessages;
end ;
end;

2.线程处理时的代码:
procedure TThread1.Execute;
begin

Coinitialize(nil);
Process;
CoUninitialize();
end;

procedure TThread1.process;
begin
isfinish:=false;
form1.ADOQuery1.Close;
form1.ADOQuery1.SQL.Clear;
sql:='代码太长,省略';
form1.ADOQuery1.SQL.Add(sql);
form1.ADOQuery1.Open;
form1.edit1.text:='查询到'+inttostr(form1.ADOQuery1.RecordCount)+'条记录!';
isfinish:=true;
end;

3.终止线程的代码
procedure TForm1.Button12Click(Sender: TObject);
begin
if assigned(myThread1) then
begin
ADOQuery1.Close;
myThread1.suspend;
myThread1.isfinish:=true;
myThread1.terminate;
progressbar1.Position:=0;
end;

end;

4.窗体退出时的代码
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ADOConnection1.Close;
application.Terminate;
end;
 
这也叫多线程么?
线程完全用的是form1的资源 而且还没有同步
建议先好好补补oo和线程的概念
 
诶,delphi已经丢掉好多年了,请各位指教啊,帮我解答这是什么原因造成
 
数据库可能发生死锁了
 
不是,线程被我停掉了,但是不知道为何关闭主窗体的时候会报错
 
你的子线程使用了主线程的资源 但是没有同步
 
老大,如何解决,请指教
 
我不知道你具体情况,代码很乱!~
可我写释放线程的代码一般都是这样:
myThread1.terminate;
myThread1.WaitFor;//很重要
myThread1.free;
 
没办法啊,我还在用delphi6.0呢[:D],大学时候学的编程语言。
来自:ball_cao, 时间:2008-9-18 9:11:51, ID:3921852
你的子线程使用了主线程的资源 但是没有同步
这个如何解决
 
你可以使用 Synchronize(process);
不过process,不能带参数·!~
还有,事件,信号量,等等可以进行同步
 
程序死掉了,用了myThread1.WaitFor和Synchronize(process);
 
那你程序那里就有问题,仔细看看!~
 
你给我个范例程序吧
 
谁来解决我的问题
 
列举一下你程序里的问题
首先,线程应该有自己的连接和query 而不是使用form1里的对象。这是oo的基本概念问题
其次,像form1.edit1.text:='查询到'+inttostr(form1.ADOQuery1.RecordCount)+'条记录!';这样的代码是需要同步的,不同步多半会出错,这是线程间通信的问题。
再次,myThread1.terminate;这样的句子只是设置了线程的状态,并不是在外面终止了线程,这是线程工作的概念问题
最后,form1.ADOQuery1.RecordCount这样的代码是非常低效率的,这不能算是错误但至少不能算是正确。
msn:ball_cao@hotmail.com
 
在线程里面type
mythead=Class(TThread)
private
Ado:TAdoquery;
Form: TForm1;
isfinish:boolean;
protected
Procedure process;
procedure Execute;
override;
public
constructor Create(Sender:TForm1) ;
end;
执行时直接调用过来,用同步Synchronize方式
 
在线程里动态建CONNECTION,就OK了。
 
一个ADOConnection在同一时刻只能进行一个操作,所以要使用多线程,就必须建立另一个(或一些)ADOConnection供线程使用,避免同一时使用同一个ADOConnection,这也是一些软件需要使用“连接池”的原因。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部