多线程查询
来源:互联网 发布:百度搜索源码 编辑:程序博客网 时间:2024/04/19 20:42
实现多线程同步查询的基本思想是,为每一个查询组件(如TQuery组件)创建一个独占的 数据库会话,然后各自进行数据库访问。需要特别注意的是,因为Delphi中的 VCL组件大多都 不是线程安全的,所以应当在线程查询结束后再将DataSource组件与查询组件关联,从而显示 在DBGrid组件中。
下面的例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗体的创建和销毁 而创建和销毁。
下面的例子给出了同时进行的两个线程查询。
线程类:
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB;
type
TDBThread=class(TThread)
private
{ 线程中的查询组件 }
FQuery: TADOQuery;
{ 与查询组件相关的数据感知组件 }
FDataSource: TDataSource;
{ 连接数据查询组件和数据感知组件的方法 }
procedure ConnectDataSource;
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query: TADOQuery;DataSource: TDataSource;iFlag:Integer); { 线程构造器 }
end;
implementation
{ TDBThread }
procedure TDBThread.ConnectDataSource;
begin
{该方法在查询结束后才调用 }
FDataSource.DataSet := FQuery;
end;
constructor TDBThread.Create(Query: TADOQuery; DataSource: TDataSource;
iFlag: Integer);
begin
FQuery := Query;
FDataSource := DataSource;
FreeOnTerminate := True;
inherited Create(False); //请设为false,否则将不会立即执行
end;
procedure TDBThread.Execute;
begin
try
FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error'); { 线程异常 }
end;
end;
end.
调用:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Button1: TButton;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Q1:TDBThread;
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from tuser');
Q1 := TDBThread.Create(ADOQuery1, DataSource1,1);
// Q1.Destroy;//不可以销毁,否则会出错
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Q1:TDBThread;
begin
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from fplist');
Q1 := TDBThread.Create(ADOQuery2, DataSource2,1);
//Q1.Destroy;//不可以销毁,否则会出错
end;
end.
- 多线程查询
- 多线程查询
- 多线程查询数据库
- 多线程查询数据库
- delphi ADOQuery多线程查询
- delphi ADOQuery多线程查询
- pthread实现多线程查询
- pthread实现多线程查询
- java多线程查询
- 多线程查询数据
- 多线程多文件查询
- Winform 多线程查询数据
- 数据库多线程查询的问题
- 自制单机多线程查询器
- sqlserver多线程查询与更新
- 多线程连接数据库查询数据
- 多线程批量域名信息查询
- Delphi多线程学习:多线程数据库查询(ADO)
- 程序员
- delphi中实现用字符串表示并操作控件的方法。
- 菜鸟求助:关于VC++和ADO代码出错
- could not find java 2 Runtime Environment
- 流的初体验(未完成)
- 多线程查询
- AWT和Swing中的绘画
- 级联性更新和删除和BCP
- 一步一步尝试在MFC下开发基于winpcap的数据包捕获和分析软件.(开发总结,建议先看)
- 关于病毒Backdoor.Gpigeon.uql
- 关于Fedora Core 5.0 通过Yum在线升级说明
- PHPLib Template笔记
- 如何追求对方
- 再登理工后山