源程序在此,谁帮我改成多线程的。 (100分)

  • 主题发起人 主题发起人 hpbj
  • 开始时间 开始时间
H

hpbj

Unregistered / Unconfirmed
GUEST, unregistred user!
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
procedure shs;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
var
table,bm: String;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
table:='s001';
bm:='02';
shs;
end;

procedure TForm1.shs;
var i:integer;
begin
ADOQuery1.SQL.Clear;
.......
ADOQuery2.Close;
end;
end.
 
改成异步的不就行了
 
数据库多线程操作必须通过不同的Session,
 
怎么改成异步?
 
定义一个线程,然后把对数据库的操作现在线程里,就OK了。不过主意,在主线程中要
定义一个ado控件,并且要连接数据库上,还要费给这个空间一些sql语句(什么语句无
所谓,但一定要又),不用执行这个语句,如果不这样的话,离一个线程就又问题。
 
//下面是多线程单元的代码.
unit Unit2;
interface
uses
Classes,windows,DB,AdoDB,ComCtrls,SysUtils,forms,comObj;
type
TQueryThread = class(TThread)
private
{ Private declarations }
FQuery:TAdoQuery;
protected
procedure Execute;
override;
public
constructor Create(ConnectString,SQL:string);
virtual;
destructor Destroy;
override;
end;

implementation
uses
main;
{ TQueryThread }
constructor TQueryThread.Create(ConnectString,sql:string);
begin
inherited Create(true);
FQuery := Tadoquery.Create(application);
FQuery.ConnectionString :=ConnectString;
FQuery.sql.add(sql);
FreeOnTerminate:=true;
Resume;
end;

destructor TQueryThread.Destroy;
begin
FQuery.Close;
inherited Destroy;
end;

procedure TQueryThread.Execute;
begin
FQuery.Open;
'.....
Fdataset.Close;
end;

end.
 
补充一下:
最主要就是要在线程中单独创建ADO组件,
这样就和BDE组件多线程操作必须通过不同的Session一样.
上面代码倒数第三行有写错,我忘了改,应为Fquery.close;
 
谢谢jihenglixin
但还有如下问题没能解决:
SQL语句需要执行许多次,所以要单独写一个过程进行调用。
如何在程序中进行调用?比如子程序名叫abc
我用abc;方式进行调用,子程序不执行。
用synchronize(abc);方式,主程序不能体现多线程(不能操作程序主界面)
怎么办?
 
意思不太明白,要不把代码贴出来看一下
 
jihenglixin
程序报错 如下:
Project abc.exe raised exception class EOleException
with message '[DBNMPNTW]ConnectionOpen (CreateFile())'
是什么原因??
您的Email?QQ? 源程序有点长
 
jihengxinxin@sina.com
 
如果你的程序不是很占用资源,以至不响应Windows消息,为什么要用多线程呢?
你用了多线程,效率就一定会更高么?创建和释放线程不需要占用资源么?
仅个人意见!
 
对,jihenglixin的代码是会出现问题,我现在也有一样的问题,正在求解,楼主解决没有?
 
来自:only you, 时间:2003-1-27 8:49:00, ID:1600480
数据库多线程操作必须通过不同的Session,

ADO中怎么用Session?
 
jihenglixin的代码有问题是因为没有调用ActiveX单元中的CoInitialize。
在多线程中使用ADO必须先调用CoInitialize,用完后调用CoUninitialize才行。
 
特尔斐,和CoInitialize有关(能说具体些吗?原因?),但CoInitialize并不能不完全解决这个问题,今天下午参照了一个代码,程序的问题解决了一大部分,运行比较稳定了,但仍有些问题,正在解决中,解决了再发帖子请大家看看,到时候敬请光临。
 
好像和CoInitialize没有关系啊……
 
后退
顶部