线程的简单问题5:多线程的调用 ( 积分: 20 )

  • 主题发起人 主题发起人 ppqingyu
  • 开始时间 开始时间
P

ppqingyu

Unregistered / Unconfirmed
GUEST, unregistred user!

我看到一个例子,也是唯一个调用数据库多线程的例子
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;
这个例子里面是把不同的Query和DataSource赋给不同的线程,Query和DataSource是先建好,并写入SQL语句的吧?他只给这一段代码。而且,这个源码当中,在线程单元中,只有一个线程,如果写多一个线程,不同的代码,不同的作用的。那些代码是写在同一个线程单元,还是新建一个线程单元中?如果是在同一个线程单元,给我一个例子好吗?简单一点没关系,我不懂如何安插那些代码在哪个位置。ppqingyu@yeah.net
 

我看到一个例子,也是唯一个调用数据库多线程的例子
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;
这个例子里面是把不同的Query和DataSource赋给不同的线程,Query和DataSource是先建好,并写入SQL语句的吧?他只给这一段代码。而且,这个源码当中,在线程单元中,只有一个线程,如果写多一个线程,不同的代码,不同的作用的。那些代码是写在同一个线程单元,还是新建一个线程单元中?如果是在同一个线程单元,给我一个例子好吗?简单一点没关系,我不懂如何安插那些代码在哪个位置。ppqingyu@yeah.net
 
简单的例子,先把窗体建起来:
1 主程序:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
RunThread1: TButton;
KillThread1: TButton;
RunThread2: TButton;
KillThread2: TButton;
procedure RunThread1Click(Sender: TObject);
procedure KillThread1Click(Sender: TObject);
procedure RunThread2Click(Sender: TObject);
procedure KillThread2Click(Sender: TObject);
private
{ Private declarations }
procedure Thread1Done(Sender:Tobject);
procedure Thread2Done(Sender:Tobject);
public
{ Public declarations }
Flabel1,Flabel2:Tlabel;
Thread1,Thread2:TMyThread;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RunThread1Click(Sender: TObject);
begin
RunThread1.Enabled:=False;
KillThread1.Enabled:=True;
Thread1:=TMyThread.Create(Form1.Label1,10000);
Thread1.OnTerminate:=Thread1Done;
end;

procedure TForm1.KillThread1Click(Sender: TObject);
begin
Thread1.Terminate;
end;

procedure TForm1.RunThread2Click(Sender: TObject);
begin
RunThread2.Enabled:=False;
KillThread2.Enabled:=True;
Thread2:=TMyThread.Create(Form1.Label2,10000);
Thread2.OnTerminate:=Thread2Done;
end;

procedure TForm1.KillThread2Click(Sender: TObject);
begin
Thread2.Terminate;
end;

procedure TForm1.Thread1Done(Sender:Tobject);
begin
RunThread1.Enabled:=True;
KillThread1.Enabled:=False;
end;

procedure TForm1.Thread2Done(Sender:Tobject);
begin
RunThread2.Enabled:=True;
KillThread2.Enabled:=False;
end;
end.

2.线程部分:
unit Unit2;
interface
uses Classes,StdCtrls,SysUtils,Dialogs;
type
TMyThread=class(TThread)
private
Flabel:Tlabel;
Max:Integer;
Fidx:Integer;
procedure UpdateLabel;
protected
procedure Execute;override;
public
constructor create(mylabel:Tlabel;number:Integer);
end;

implementation
uses unit1;
constructor TMyThread.create(mylabel:Tlabel;number:Integer);
begin
inherited Create(False);
if number>10000 then
number:=10000;
if number<1 then
number:=1;
Max:=number;
Flabel:=mylabel;
FreeOnTerminate:=True;
end;

procedure TMyThread.Execute;
var
idx:Integer;
begin
for idx:=0 to Maxdo
begin
synchronize(UpdateLabel);
fidx:=idx;
if terminated then
exit;
end;
end;

procedure TMyThread.UpdateLabel();
begin
Flabel.caption:=IntToStr(Fidx);
end;
end.
 
能否再给一个数据库的例子,我对数据库的理解比其他的多一点,所以有关数据库的代码我比较看得明白一点
 
接受答案了.
 
后退
顶部