什么是多线程? ( 积分: 30 )

  • 主题发起人 主题发起人 liangexcel
  • 开始时间 开始时间
L

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
接触线程不久,但是怎么也弄不清线程到底是什么,网友最多说的一句是线程可以在背后运行.不影响界面.所以我把线程当成了一个自定义的事件,不知道对不对?
但是多线程呢?每次创建一个线程单元,系统就自动写入一个procedure Thread.Execute;
网友们都说把事件写入Execute就是线程的代码了.所以我就把一个Execute当成了一个线程,那多个Execute就是多个线程了.我想这个是错的吧?
我看了很多的例子,好像就是一个线程单元一个Execute方法,好像并没有多个Execute,重复调用只不过是在主程中定义变量调用,例如:
var
Q1,Q2:Thread;
begin
Q1.Create(参数11,参数12);
Q2.Create(参数21,参数22);
end;
这例子中,是不是这样就是多线程?但是这样只是在同一个事件,用不同的参数调用,如果是不同的事件,那是否要建立多个线程单元?
 
接触线程不久,但是怎么也弄不清线程到底是什么,网友最多说的一句是线程可以在背后运行.不影响界面.所以我把线程当成了一个自定义的事件,不知道对不对?
但是多线程呢?每次创建一个线程单元,系统就自动写入一个procedure Thread.Execute;
网友们都说把事件写入Execute就是线程的代码了.所以我就把一个Execute当成了一个线程,那多个Execute就是多个线程了.我想这个是错的吧?
我看了很多的例子,好像就是一个线程单元一个Execute方法,好像并没有多个Execute,重复调用只不过是在主程中定义变量调用,例如:
var
Q1,Q2:Thread;
begin
Q1.Create(参数11,参数12);
Q2.Create(参数21,参数22);
end;
这例子中,是不是这样就是多线程?但是这样只是在同一个事件,用不同的参数调用,如果是不同的事件,那是否要建立多个线程单元?
 
1 Execute只是线程的方法,当它被调用时,线程对象才开始运行;
2 上面的代码只是创建进程,是先执行Q1.Create(参数11,参数12);语句,再执行
Q2.Create(参数21,参数22);语句。但要记住,线程的运行是并行的,并不是Q1
结束后才执行Q2,而是两个可以同时运行。
3 给你个简单的例子看看:
主程式:
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.

线程部分:
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.
 
to missinwind:
谢谢你,你看看我理解的对不对?
{关于Thread1.OnTerminate:=Thread1Done;我的理解是这样:
1。线程开始后,为Thread1创建一个释放的标记,
2.当执行了Three1Doo时,触发这个标记。
3。当标记被触发时,就执行线程单元中的FreeOnTerminate:=True;
这样对吗?
呵呵。。。我觉得不太对劲,因为我觉得执行线程单元中的FreeOnTerminate:=True,那不是procedure TMyThread.Execute这个线程释放了?还是这个Thread1.OnTerminate:=Thread1Done;仅仅是释放Thread1?就是说每调用的一个线程就是有一个OnTerminate,而不仅是线程单元的那个老大?}
{还有一点,你的这样也是一个Execute方法,执行的是一个循环,但是如果我还有一个循环,例如说是从1到MAX的阶乘,这个当然和你的那个事件不能相融了,那是要建一个新的线程单元,再在新单元内写Execute?或者是在你的线单元内再写一个Execute?(这是我的一个死结)}
 
1.Thread1.OnTerminate:=Thread1Done;是指定结束线程1时要做的事,即Thread1Done
事件,只有当线程1结束时才触发这个事件;
2 Thread1.Terminate;这句才是结束线程1;
3 FreeOnTerminate:=True;是指定当线程结束时是否--自动--释放;
4 ‘每调用的一个线程就是有一个OnTerminate’-----对;
5 因为Thread1和Thread2功能一样,所以只用一个单元就行了;实现另外的功能,要
重新写一个。Execute是线程的入口,只能有一个。
 
FreeOnTerminate:=True;是所有开通线程结束后才调用的,是吗?
 
已经说过了,因为偷了一下懒[:)],所以Thread1和Thread2调用同一个单元文件;实际
上功能不同的线程是要各写各的,每个都有各自的Terminate事件和Destroy事件;
而FreeOnTerminate:=True;是决定Destroy事件是否自动执行。
顺序是:先Terminate, 再Destroy
明白吗?
 
明白了,谢谢你了.
 
后退
顶部