线程编程时,我写了一个线程程序,在运行时没有问题,但程序结束后,说句柄无效, ( 积分: 30 )

  • 主题发起人 主题发起人 willing66
  • 开始时间 开始时间
在ActiveX单元
 
哦,是了,忘了加上了。
ActiveX
 
非常感谢大家的帮助,我现在用了一个例子做试验,可以成功运行,我想做的应该也以成功,先谢过大家了,等我真正应用成功后再来结帖。如果有问题再来请教大家。
 
如果我的ADOConnection, ADOQuery, DataSource都是用控件拖放在到窗体上,就是不行,没有办法解决呀?
如果只是在线程中创建是可以成功完成任务,我现在要做是和别人一起开发的,是共用一个数据源ADOConnection来连接的,有没有办法解决这种问题?
还想问一下就是oInitialize(nil)和Couninitialize的作用是什么。
 
unit Uthreadqry;
interface
uses
Classes, ActiveX, ADODB;
type
TThQry = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
end;

implementation
uses
threadqryFrm;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TThQry.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ TThQry }
procedure TThQry.Execute;
var
conn: TADOConnection;
qry:TADOQuery;
begin
{ Place thread code here }
// This is true.
//// CoInitialize(nil);
//// Conn:=TADOConnection.Create(nil);
//// Conn.LoginPrompt:=False;
//// qry:=TADOQuery.Create(nil);
////
//// Conn.ConnectionString:=Form1.ADOConnection1.ConnectionString;
//// qry.Close;
//// qry.SQL.Text := 'SELECT * FROM KC';
//// qry.Connection:=Conn;
//// Form1.DataSource1.DataSet:=qry;
//// qry.Open;
//// Couninitialize;
Coinitialize(nil);
Form1.ADOQuery1.Close;
Form1.ADOQuery1.SQL.Text :='SELECT * FROM KC';
Form1.ADOQuery1.Open;
Couninitialize;
end;

end.


unit threadqryFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure threaddone(sender: TObject);
procedure thover;
end;

var
Form1: TForm1;
implementation
uses
Uthreadqry;
var
th: TThQry;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin

th :=TThQry.Create(True);
th.FreeOnTerminate:=True;
th.OnTerminate :=threaddone;
th.Resume;
end;

procedure TForm1.thover;
begin
th:=nil;
end;

procedure TForm1.threaddone(sender: TObject);
begin
th:=nil;
end;

end.

这个程序是可以正确的,但是我前面写的却不能正确。
 
如果我的ADOConnection, ADOQuery, DataSource都是用控件拖放在到窗体上,就是不行,没有办法解决呀?
如果只是在线程中创建是可以成功完成任务,我现在要做是和别人一起开发的,是共用一个数据源ADOConnection来连接的,有没有办法解决这种问题?
还想问一下就是oInitialize(nil)和Couninitialize的作用是什么。
 
有没有帮忙回答一下
 
如果我的ADOConnection, ADOQuery, DataSource都是用控件拖放在到窗体上,就是不行,没有办法解决呀?
如果只是在线程中创建是可以成功完成任务,我现在要做是和别人一起开发的,是共用一个数据源ADOConnection来连接的,有没有办法解决这种问题?
还想问一下就是oInitialize(nil)和Couninitialize的作用是什么。
 
没有回答自己顶
 
你将同一个数据源连接字符串传送到线程,再在线程中完程查询任务,不就可以了吗?
起初始化和释放的作用!
 
非常感谢!
 
谢谢大家的指点!!!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
615
import
I
后退
顶部