关于线程的小问题(30分)

  • 主题发起人 主题发起人 halei
  • 开始时间 开始时间
H

halei

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚开始学习使用线程,我看着例子写了以下代码,但是运行后,一按botton1,
就弹出"thread error:句柄无效 (6)"
请帮帮忙
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ADOQuery1: TADOQuery;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
tMyThread.Create(adoquery1);
end;
end.

unit Unit2;
//线程单元
interface
uses
Classes,ADODB;
type
TMyThread=class(TThread)
private
qry:tadoquery;
protected
procedure execute;override;
public
constructor create(querya:tadoquery);overload;
end;

implementation
uses Unit1;
constructor
TMyThread.Create(querya:tadoquery);
begin
qry:=querya;
FreeOnTerminate:=True;
end;
procedure tmythread.Execute;
begin
qry.open;
end;

end.
 
关注,不是骗分哟,我也不懂!
 
我没太仔细看,不过你既然敢重载线程的创建方法,怎么可以不在自己的创建代码前
加inherited呢。你这样等于根本没有创建线程对象啊!
 
上面的有道理!好好思考一下吧
 
定义个 TMyThread 的变量:
var
mThread : TMyThread;
begin
mThread = TMyThread.Create(adoquery1);
end;
 
改這里看看:
constructor
TMyThread.Create(querya:tadoquery);
begin
inherited create(flase);
//加上此句
qry:=querya;
FreeOnTerminate:=True;
end;
 
constructor
TMyThread.Create(querya:tadoquery);
begin
inherited create(true);
//创建后挂起
qry:=querya;
FreeOnTerminate:=True;
Resume;
//准备好后继续
end;
 
谢谢各位,我把代码改成:
constructor
TMyThread.Create(querya:tadoquery);
begin
inherited create(true);
//创建后挂起
qry:=querya;
FreeOnTerminate:=True;
Resume;
//准备好后继续
end;

但是又弹出对话框:"标记没有引用存储"
 
前面加CoInitialize(nil);
后面加CoUninitialize();
因为你在线程中创建ADO控件
 
to eyes4
加在那里呀?
我加在:
CoInitialize(nil);
inherited create(false);
qry:=querya;
FreeOnTerminate:=True;
CoUninitialize();
编译时却不能通过,说没定义。
 
uses ActiveX
 
还是又弹出对话框:"标记没有引用存储"
我用F7看,执行完 tmythread.create后,就回到botton1.click去了。没有执行tmythread.execute.
 
你得在execute设个断点
procedur TMyThread.Execute;
begin
CoInitialize(nil);
try
//ADO operation
finally
CoUninitialize();
end;
end;
 
CoInitialize(nil);和CoUninitialize();
要加在TMyThread.Execute中,你加的那地方不是在线程内部
 
多人接受答案了。
 
后退
顶部