写了一个多线程,但是老出错不知道哪里出错了,实在找不出,请教大家,希望大家帮个忙!谢谢!!
窗体上有两个控件,一个是BUTTON,一个是PANEL,分别为他们命名为
btnMultipleThreads , pnlBarHost ;
一共有两个单元,主单元为ThreadsEgForm , 内一个单元为WaitThread以下代码为:
(单元ThreadsEgForm 代码 )unit ThreadsEgForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
btnMultipleThreads: TButton;
pnlBarHost: TPanel;
procedure btnMultipleThreadsClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses WaitThread ;{$R *.dfm}procedure TForm1.btnMultipleThreadsClick(Sender: TObject);
var
WaitThread : TWaitThread ;
Bar : TProgressBar ; //这里出错
begin
Bar := TProgressBar.Create(Self); //这里出错
Bar.Smooth := True ; //这里出错
Bar.Left := Random(pnlBarHost.Width - Bar.Width) ; //这里出错
Bar.Top := Random(pnlBarHost.Height - Bar.Height) ;
Bar.Parent := pnlBarHost ;
WaitThread := TWaitThread.Create(Random(20000) + 1000 , Bar) ;
WaitThread.Resume ;end;
end.//下个单元代码
(单元WaitThread代码)
unit WaitThread;interfaceuses
Classes , Windows, ComCtrls;type
TWaitThread = class(TThread)
private
FDelayMS : Cardinal ;
FBar : TProgressBar ;
FNewBarPos : Integer ;
procedure InitBar ;
procedure UpdateBar ;
procedure KillBar ; protected
procedure Execute; override; public
constructor Create(DelayMS : Cardinal ; Bar : TProgressBar) ;
end;implementation
{ WaitThread }const
DelayChunk = 100 ;constructor TWaitThread.Create(DelayMS : Cardinal; Bar : TProgressBar) ;
begin
inherited Create(True) ;
FreeOnTerminate := True ;
FDelayMS := DelayMS ;
FBar := Bar ;
end ;procedure TWaitThread.Execute;
var
I : Integer ;
begin
Synchronize(InitBar) ;
for I := 1 to FDelayMS div DelayChunk do
begin
Sleep(DelayChunk) ;
FNewBarPos := I ;
Synchronize(UpdateBar) ;
if Terminated then
Break
end ;
Beep(250 + Random(100) , 50) ;
Synchronize(KillBar) ;
end ;procedure TWaitThread.InitBar ;
Begin
if Assigned(FBar) then
begin
FBar.Min := 0 ;
FBar.Max := FDelayMS div DelayChunk ;
FBar.Position := FBar.Min
end
end ;procedure TWaitThread.UpdateBar ;
begin
if Assigned(FBar) then
FBar.Position := FNewBarPos ;
end ;procedure TWaitThread.KillBar ;
begin
FBar.Free
end ;
initialization
Randomize
end.
最后一个错误提示为:
[Fatal Error] ThreadsEg.dpr[6]:Could not compile used unit 'ThreadsEgForm.pas'怎么改呀?大家帮个忙吧???
谢谢了
窗体上有两个控件,一个是BUTTON,一个是PANEL,分别为他们命名为
btnMultipleThreads , pnlBarHost ;
一共有两个单元,主单元为ThreadsEgForm , 内一个单元为WaitThread以下代码为:
(单元ThreadsEgForm 代码 )unit ThreadsEgForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
btnMultipleThreads: TButton;
pnlBarHost: TPanel;
procedure btnMultipleThreadsClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses WaitThread ;{$R *.dfm}procedure TForm1.btnMultipleThreadsClick(Sender: TObject);
var
WaitThread : TWaitThread ;
Bar : TProgressBar ; //这里出错
begin
Bar := TProgressBar.Create(Self); //这里出错
Bar.Smooth := True ; //这里出错
Bar.Left := Random(pnlBarHost.Width - Bar.Width) ; //这里出错
Bar.Top := Random(pnlBarHost.Height - Bar.Height) ;
Bar.Parent := pnlBarHost ;
WaitThread := TWaitThread.Create(Random(20000) + 1000 , Bar) ;
WaitThread.Resume ;end;
end.//下个单元代码
(单元WaitThread代码)
unit WaitThread;interfaceuses
Classes , Windows, ComCtrls;type
TWaitThread = class(TThread)
private
FDelayMS : Cardinal ;
FBar : TProgressBar ;
FNewBarPos : Integer ;
procedure InitBar ;
procedure UpdateBar ;
procedure KillBar ; protected
procedure Execute; override; public
constructor Create(DelayMS : Cardinal ; Bar : TProgressBar) ;
end;implementation
{ WaitThread }const
DelayChunk = 100 ;constructor TWaitThread.Create(DelayMS : Cardinal; Bar : TProgressBar) ;
begin
inherited Create(True) ;
FreeOnTerminate := True ;
FDelayMS := DelayMS ;
FBar := Bar ;
end ;procedure TWaitThread.Execute;
var
I : Integer ;
begin
Synchronize(InitBar) ;
for I := 1 to FDelayMS div DelayChunk do
begin
Sleep(DelayChunk) ;
FNewBarPos := I ;
Synchronize(UpdateBar) ;
if Terminated then
Break
end ;
Beep(250 + Random(100) , 50) ;
Synchronize(KillBar) ;
end ;procedure TWaitThread.InitBar ;
Begin
if Assigned(FBar) then
begin
FBar.Min := 0 ;
FBar.Max := FDelayMS div DelayChunk ;
FBar.Position := FBar.Min
end
end ;procedure TWaitThread.UpdateBar ;
begin
if Assigned(FBar) then
FBar.Position := FNewBarPos ;
end ;procedure TWaitThread.KillBar ;
begin
FBar.Free
end ;
initialization
Randomize
end.
最后一个错误提示为:
[Fatal Error] ThreadsEg.dpr[6]:Could not compile used unit 'ThreadsEgForm.pas'怎么改呀?大家帮个忙吧???
谢谢了
建议使用楼上的方法试试,同时可以在uses中加入ComCtrls;看看如何
照sxtdxvb(Delphi被卖,何去何从?C#转型中...(QQ:479543842)) 说我在在主窗体上放置个ProgressBar,然后就能运行,以后删掉照样能运行!!!谢谢你!问题解决!
不过我不明白这是为什么呀???可以说说理由吗???