您好,在多线程遇到一个问题,谢谢指导,欢迎给出关于使用多线程的指导(50分)

  • 主题发起人 主题发起人 驿路的梦
  • 开始时间 开始时间
驿

驿路的梦

Unregistered / Unconfirmed
GUEST, unregistred user!
编译无错,但运行时出错 :
错误信息:
Project Project1.Exe Raised exception class EOleException with message '尚未调用 CoInitialize .',

调用:

procedure TForm1.Button1Click(Sender: TObject);
var
Thread: TThreadConnect;
begin
Thread := TThreadConnect.Create(SC);
Thread.OnTerminate := ThreadOnTerminate ;
end;
OnTerminate事件 :
procedure TForm1.ThreadOnTerminate(Sender: TObject) ;
begin
DataSource1.DataSet := Query ;
end;

线程 :
type
TThreadConnect = class(TThread)
private
TConnection: TADOConnection;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(CS: WideString); virtual;//ADOConnection链接字符串
end;
var
Query: TADOQuery;
constructor TThreadConnect.Create(CS: WideString);
begin
inherited Create(False);
TConnection := TADOConnection.Create(Nil) ;
TConnection.LoginPrompt := False;
TConnection.ConnectionString := CS;
FreeOnTerminate := True;
end;

procedure TThreadConnect.Execute;
begin
{ Place thread code here }
try
TConnection.Open;
with Query do
begin
Close;
Connection := TConnection;
Sql.Clear;
Sql.Text := 'select * from zhang_cpkkc';
try
Open;
except
Close;
Sql.Clear;
end;
end;
Finally
TConnection.Free ;
end;
end;

请教 :
1.为何会错 ?
2.线程中到底应该怎样同步使用资源? ,使用哪些资源需要同步 ?

谢谢
 
你的程序开头有没有调用Application.Initialize;
系统生成的代码可不能随便的删的

你自己也可以调用一下CoInitialize,在程序的开头
 
>>>>'尚未调用 CoInitialize .'
解决方法:
procedure TThreadConnect.Execute;
begin
{ Place thread code here }
try
CoInitialize(nil);
TConnection.Open;
with Query do
begin
Close;
....
 
同意~自己初始化COM,对吧?哈哈~
 
先coinitialize(nil);
最后一点的后面加上couninitialize;
 
谢谢你们
CoInitialize() 在哪个单元 ? 帮助中没有
按照Another_eYes先生的,
编译出错 :[Error] Uthreadconnection.pas(55): Undeclared identifier: 'CoInitialize'

谢谢
 
uses Activex;
 
谢谢楼上:),现在这个没有错了但是不能达到我的目的。 我的窗体上的 DBGrid 中没有数据
参照代码解释如下:
--------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
Thread: TThreadConnect;
begin
Thread := TThreadConnect.Create(SC);
//使用线程想要达到的目标:
链接到数据库并且打开数据表,取得其中的纪录
Thread.OnTerminate := ThreadOnTerminate ;
//在OnTerminate中将取得的纪录绑定到DBGird1
end;
OnTerminate事件 :
procedure TForm1.ThreadOnTerminate(Sender: TObject) ;
begin
DataSource1.DataSet := Query ;
//在属性中已经静态设置 DBGrid1.DateSource = DataSource1 ;
end;

线程 :
type
TThreadConnect = class(TThread)
private
TConnection: TADOConnection;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(CS: WideString); virtual;//ADOConnection链接字符串
end;
var
Query: TADOQuery;
constructor TThreadConnect.Create(CS: WideString);
begin
inherited Create(False);
TConnection := TADOConnection.Create(Nil) ;
TConnection.LoginPrompt := False;
TConnection.ConnectionString := CS;
FreeOnTerminate := True;
end;

procedure TThreadConnect.Execute;
begin
{ Place thread code here }
try
TConnection.Open;
with Query do
begin
Close;
Connection := TConnection;
Sql.Clear;
Sql.Text := 'select * from zhang_cpkkc'; //这儿有语句的,应该给出结果显示在Form1.DBGrid1中
try
Open;
except
Close;
Sql.Clear;
end;
end;
Finally
TConnection.Free ;
end;
end;

------------------------------------------------------------------------
请问该怎么做 ? 我得线程哪儿错了 ? (我是在线程单元中写的线程,窗体和线程是两个单元)
望您指导,谢谢
 
FreeOnTerminate 设成false
然后手工释放线程

FreeOnTerminate 设成True的时候会自动释放的,另外一个线程(主窗口)不能安全调用此线程中的代码和变量
 
还是不行......
 
try
TConnection.Open;
with Query do
begin
Close;
Connection := TConnection;
Sql.Clear;
Sql.Text := 'select * from zhang_cpkkc';
try
Open;
except
Close;
Sql.Clear;
end;
end;
Finally
TConnection.Free ;
end;

hehe, 自相矛盾的两句。connection都free掉了,query当然自动关闭啦。
所以当线程结束后DBGrid是空的说明线程正确运行完成了。
 
多人接受答案了。
 
后退
顶部