按网上的例子做了连接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;
然后改成在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;
解决方案 »
- 简单的Socket通信,一直在线等,急~~~,成功则结贴
- 为什么打印窗体上面的panel 在A4的纸上面 只有 A4 的 1/4 大小呢,该怎么样做 代码如下:
- 请问vc 中的 alt 相当于delphi的什么概念?
- 关于listbox的滚动条问题
- 怎样用sql做一个 交叉表???
- 3个问题请教各位。
- 进销存中的进货单录入,用什么控件比较好用呢?或是有什么好的实现方法?
- 株洲茶陵的程序员请进!
- 求一个子串搜索函数,马上给分!!
- 请教有关SQL数据更新的问题!
- 请大家帮忙看一段程序.我想在richedit中选中某行,然后将其颜色改变的.有点问题.谢谢!
- 用Delphi写好了dll后拿到别的机器上要怎么注册?
只要在工程中将DataSource的DataSet指向TADOQuery组件就行了。
翻以前的帖子说是MDI窗口用多线程会抱错误
这个是怎么会事????
好象是不需要,因为按例子上说,原来datasource的dataset设置是空的,是查询完后在设置上去,这句语句就这个作用而已,如果默认把dataset设置好,不用这句语句的话关闭窗口还是会抱错,什么内存不能为 read之类的,主窗口关闭也是会抱错然后要命的是,这个子窗口关闭后,同类的子窗口就再也打不开了,提示什么正在使用当中~~~~~
procedure TThreadQuery.Destroy;{执行销毁方法}
begin
CoUnInitialize(nil); inherited;
end;
试试看。