按网上的例子做了连接SQL查询的多线程,在普通窗口按例子都运行正常
然后改成在MDI子窗口下运行,控件也改成ADOstrpro那个,然后也加了CoInitialize(nil);
但程序运行到Synchronize(ConnectDataSource)这一步后,程序就没响应,等了好久也一样
最后干脆不执行Synchronize,把datasource直接和ADO...ADO连接,但子窗口关闭时会抱错
不知道如何解决......代码是这个TThreadQuery = class(TThread) { 声明线程类 } 
private 
FQuery: adostoredproc; { 线程中的查询组件 } 
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 } 
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 } 
protected 
procedure Execute; override;{ 执行线程的方法 } 
public 
constructor Create(Query: adostoredproc; 
DataSource: TDataSource); virtual; { 线程构造器 } 
end; procedure TThreadQuery.Execute;{   执行线程的方法   } 
begin 
Try 
   CoInitialize(nil);
    FQuery.Open;   {   打开查询   } 
   Synchronize(ConnectDataSource);{   线程同步   语句运行后没响应} except 
ShowMessage( 'Query   Error ');   {   线程异常   } 
end;procedure TForm1.FormCreate(Sender: TObject); 
begin 
Q1 := TThreadQuery.Create(Query1, DataSource1); 
end; 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
Q1.Terminate; { 销毁之前终止线程执行 } 
Q1.Destroy; 
end;

解决方案 »

  1.   

    好像不需要这一句Synchronize(ConnectDataSource);{   线程同步   语句运行后没响应}  
    只要在工程中将DataSource的DataSet指向TADOQuery组件就行了。
      

  2.   

    ...没人知道???
    翻以前的帖子说是MDI窗口用多线程会抱错误
    这个是怎么会事????
      

  3.   


    好象是不需要,因为按例子上说,原来datasource的dataset设置是空的,是查询完后在设置上去,这句语句就这个作用而已,如果默认把dataset设置好,不用这句语句的话关闭窗口还是会抱错,什么内存不能为 read之类的,主窗口关闭也是会抱错然后要命的是,这个子窗口关闭后,同类的子窗口就再也打不开了,提示什么正在使用当中~~~~~
      

  4.   

    增加一个线程销毁方法:
    procedure TThreadQuery.Destroy;{执行销毁方法}  
    begin  
      CoUnInitialize(nil);   inherited;
    end;
    试试看。