我也在做类似的项目,不过代码不能给你(我是给上海市做的)。我开了四个线程,当然现在
还不是十分稳定。下面是从别人那里“偷”来得,你先看看,以后可以多多交流。xzhengy@263.net
下面就是一个基本的继承TThread生成的多线程类。
QuerThrd.Pas
unitQuerThrd;
interface
uses
Classes,DBTables;
type
TQueryThreadΚclass(TThread)
private
fQuery:tQuery;
protected
procedureExecute;override;
public
constructorCreate(Suspended:Boolean;Query:
TQuery);
end;
implementation
constructor
TQueryThread.Create(Suspended:Boolean;Quer
y:TQuery);
begin
inheritedCreate(Suspended);
fQuery:ΚQuery;
FreeOnTerminate:ΚTrue;
end;
procedureTQueryThread.Execute;
begin
fQuery.Open;
end;
end.
在上面这个简单的例子中,我们构造了一个TThread的子类TQuery?Thread,用于在后
台执行数据库查询。在该类的Create函数中,传递了两个参数Suspended和Query,其中
Suspended用于控制线程的运行,如果Suspend为真,TQueryThread类的线程在建立后将
立即被悬挂,一直到运行了Resume方法,该线程才会继续执行,Query参数用于接受一个
已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运
行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程
类中运行的语句都必须写在这个过程里。
实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择DELPHI的File菜
单下的new选项,再选“TThreadObject”项目,DELPHI就会为你构造基本的程序模块。
然后我们可以根据需要再做相应的修改。
进程的执行:
假设我们已经建立了一个窗体FORM1,窗体中有我们将要使用的查询控件Query1。那么
我们在该单元的
USES部分加入上面写的QuerThrd单元。
procedureTForm1.Button1Click(Sender:TObject);
begin
{建立一个运行的进程}
TQueryThread.Create(False,Query1);
end;
如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行
查询。注意
TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错误
之一,不过在这里由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当
Execute里的语句执行完
后,TQueryThread类占据的内存控件将被自动释放。
然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们
还必须解决好同步的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会
有任何冲突。但实
际上,可能同时运行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,
我们还需要为Query1
增加一个Tsession控件。
其实,虽然我们也许没有亲自使用过Session控件,但实际上,在所有的数据库访
问时DELPHI都会自动建
立一个临时的Session控件,使用完后又动态地删除掉它。在平常的数据库编程时,
用不着我们亲自来操作,
但在数据库多线程执行的情况下,为了不相互冲突,我们必须为每个数据库访问都定
制自己的Session控件。
这个步骤非常简单,我们只需要在窗体中增加一个Session控件,然后给它的属性
“Sessionname”写一个任
意的名字,并再在Query1的“Sessionname”中写一个相同的名字。这样我们的数
据库程序就安全了。
另一类需要解决同步问题的是那些对VCL资源进行操作的程序,这类的程序非常多,
好在解决的方法也非常简单。