大虾帮看看,谢了..以下是示例代码,是关于文件压缩的,当文件多的时候,运行for循环时,
CPU就会100%,我在Click事件后加上MyThread,好像好一点点.请问:
1.这样的多线程安全吗?
2.ProgressBar1是用多线程运了吗?
3.请问如果要让下面的代码,在窗口一显示后ProgressBar1才从0开始执行,如何改?
为什么下面的代码我放到FormShow下的话,一运行到完了直接显示进度条到100%?procedure TInformForm.AddfileClick;
var
MyThread:TThread;
i: integer;
begin
MyThread:=TThread.Create(true); //建立线程
MyThread.FreeOnTerminate :=True; for i := 1 to 6000 do //6000个文件
begin
ProgressBar1.StepBy(1);
{略...}
end;
end;
CPU就会100%,我在Click事件后加上MyThread,好像好一点点.请问:
1.这样的多线程安全吗?
2.ProgressBar1是用多线程运了吗?
3.请问如果要让下面的代码,在窗口一显示后ProgressBar1才从0开始执行,如何改?
为什么下面的代码我放到FormShow下的话,一运行到完了直接显示进度条到100%?procedure TInformForm.AddfileClick;
var
MyThread:TThread;
i: integer;
begin
MyThread:=TThread.Create(true); //建立线程
MyThread.FreeOnTerminate :=True; for i := 1 to 6000 do //6000个文件
begin
ProgressBar1.StepBy(1);
{略...}
end;
end;
你要设计一个线程类,从TThread继承,覆盖它的execute方法,在这个方法里运行你的处理过程
下面的代码可以执行,但一样的代码移植到项目里就有问题了,
请问是什么原因一般?
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;{声明多线程}
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
type
TMainForm = class(TForm)
ProgressBar1: TProgressBar;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure Button2Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementationuses Unit1;{$R *.dfm}procedure TMyThread.Execute;
var
i:Integer;
begin FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
mainform.ProgressBar1.Max := 1000; //--------------为什么mainform找不到?-------------
for i := 1 to 1000 do
begin
mainform.ProgressBar1.StepBy(1);
end;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
TMyThread.Create(False); //调用
end;procedure TMainForm.Button2Click(Sender: TObject);
begin
if not Assigned(Form2) then Form2.Free;
Screen.Cursor:=crHourGlass;
Form2:=TForm2.Create(self);
Form2.Position:=poScreenCenter;
Screen.Cursor:=crDefault;
Form2.Show;
end;end.
比较简单的做法是:在你的线程类里增加个MsgHandle,用来记录主线程的句柄,在Execute过程中可以用postmessage来向主界面反馈执行进度。