我在主窗体中创建了两个线程分别控制两个进度条pb1和pb2。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
pb1: TProgressBar;
pb2: TProgressBar;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
public
ThreadsRunning:Integer;
procedure ThreadDone(Sender: TObject);
end;var
Form1: TForm1;implementation
uses
UnitThread;
{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
var
t1,t2:TTest;
begin
btn1.Enabled:=False;
ThreadsRunning:=2;
t1:=TTest.Create(pb1);
t2:=TTest.Create(pb2);
t1.OnTerminate:=ThreadDone;
t2.OnTerminate:=ThreadDone;
end;procedure TForm1.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
if ThreadsRunning = 0 then
begin
btn1.Enabled := True;
end;
end;
end.
线程类代码如下:
unit UnitThread;interface
uses
Classes, ComCtrls;
type
TTest=class(TThread)
private
Fpb:TProgressBar;
procedure process;
protected
procedure Execute; override;
public
constructor Create(pb:TProgressBar);
end;
implementationconstructor TTest.create(pb:TProgressBar);
begin
inherited Create(False);
fpb:=pb;
FreeOnTerminate := True;
end;procedure TTest.Execute;
begin
Synchronize(process);
end;procedure TTest.process;
var
i:Integer;
begin
Fpb.Max:=10000;
i:=0;
while i<10000*2 do
begin
Inc(i);
Fpb.Position:=(Fpb.Position+1) mod Fpb.Max;
end;
end;end.
没弄过多线程的东西,望过来人帮我这个门外人跨过这个门槛!感激不尽!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
pb1: TProgressBar;
pb2: TProgressBar;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
public
ThreadsRunning:Integer;
procedure ThreadDone(Sender: TObject);
end;var
Form1: TForm1;implementation
uses
UnitThread;
{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
var
t1,t2:TTest;
begin
btn1.Enabled:=False;
ThreadsRunning:=2;
t1:=TTest.Create(pb1);
t2:=TTest.Create(pb2);
t1.OnTerminate:=ThreadDone;
t2.OnTerminate:=ThreadDone;
end;procedure TForm1.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
if ThreadsRunning = 0 then
begin
btn1.Enabled := True;
end;
end;
end.
线程类代码如下:
unit UnitThread;interface
uses
Classes, ComCtrls;
type
TTest=class(TThread)
private
Fpb:TProgressBar;
procedure process;
protected
procedure Execute; override;
public
constructor Create(pb:TProgressBar);
end;
implementationconstructor TTest.create(pb:TProgressBar);
begin
inherited Create(False);
fpb:=pb;
FreeOnTerminate := True;
end;procedure TTest.Execute;
begin
Synchronize(process);
end;procedure TTest.process;
var
i:Integer;
begin
Fpb.Max:=10000;
i:=0;
while i<10000*2 do
begin
Inc(i);
Fpb.Position:=(Fpb.Position+1) mod Fpb.Max;
end;
end;end.
没弄过多线程的东西,望过来人帮我这个门外人跨过这个门槛!感激不尽!
begin
process;
end;
-------------------------------------------------------
本回复由大傻的破玩意儿【CSDN's forum Explorer】完成!
软件功能强大,速度超快!!支持中...
软件下载地址:http://CoolSlob.ys168.com
----------------
procedure TTest.process;
var
i:Integer;
begin
Fpb.Max:=10000;
i:=0;
while i<10000*2 do
begin
Inc(i);
Fpb.Position:=(Fpb.Position+1) mod Fpb.Max;
Sleep(1);//加了这行
end;
end;
-------------------------------------------------------
本回复由大傻的破玩意儿【CSDN's forum Explorer】完成!
软件功能强大,速度超快!!支持中...
软件下载地址:http://CoolSlob.ys168.com
本回复由大傻的破玩意儿【CSDN's forum Explorer】完成!
软件功能强大,速度超快!!支持中...
软件下载地址:http://CoolSlob.ys168.com
begin
Synchronize(process);
sleep(0); //让出线程运行权
end;
仅这句Fpb.Position:=(Fpb.Position+1) mod Fpb.Max; 用Synchronize包装起来就是了
用你说的方法,没有解决问题。窗体还是无法响应。并且两个进度条也不是同时“前进”。
在你说的那个地方加了sleep后,窗体能及时响应用户操作了。即使是sleep(0)也行。
不过,可以看出进度条的速度明显慢了很多。
还有就是用了Synchronize两个线程就不是并列运行,这不就失去了多线程的意义了吗?原因何在?
各位高手!