lazarus开发界面程序用线程显示进度条,效果更好,以前没有另外显示线程,遇到上传文件或其他较长时间操作,界面就卡在那里,体验不好,现在另外启动线程操作,主界面就不至于卡在那里。
首先在主界面上定义线程
type
{ TMyBackupThread }
TMyBackupThread = class(TThread)
private
fStatusText: string;
procedure ShowStatus;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: boolean);
end;
{ TForm1 }
TForm1 = class(TForm)
然后在实现线程内容
{TBackupThread}
procedure TMyBackupThread.ShowStatus;
// this method is only called by Synchronize(@ShowStatus) and therefore
// executed by the main thread
// The main thread can access GUI elements, for example Form1.Caption.
begin
writeln( fStatusText);
form1.Memo1.Append(fStatusText);
end;
procedure TMyBackupThread.Execute;
var
Respo: TStringStream;
S: string;
begin
fStatusText := 'Backup Starting ...';
Synchronize(@Showstatus); //If I remark this, it causes "access violation" error
with TFPHttpClient.Create(nil) do
try
Respo := TStringStream.Create('');
WriteLn(form1.Memo1.Lines.Strings[0]);
WriteLn(Formatdatetime('yyyy-mm-dd hh:nn:ss.zzz',now));
FileFormPost(requrl + 'downFile', 'file', form1.Memo1.Lines.Strings[0], Respo);
S := Respo.DataString;
WriteLn(s);
WriteLn(Formatdatetime('yyyy-mm-dd hh:nn:ss.zzz',now));
form1.Memo1.Append(S);
Respo.Destroy;
finally
Free;
end;
fStatusText := 'Backup Completed';
Synchronize(@Showstatus);
MyShowThread.active:=false;
Form3.hide;
end;
constructor TMyBackupThread.Create(CreateSuspended: boolean);
begin
FreeOnTerminate := True;
inherited Create(CreateSuspended);
end;
然后就可以在主界面里需要的地方调用了
procedure TForm1.btnUpClick(Sender: TObject);
var
MyBackupThread : TMyBackupThread;
begin
MyBackupThread := TMyBackupThread.Create(True); // With the True parameter it doesn't start automatically
if Assigned(MyBackupThread.FatalException) then
raise MyBackupThread.FatalException;
// Here the code initialises anything required before the threads starts executing
if Form3=nil then
begin
Form3:=TForm3.Create(application);
WriteLn('TForm3.Create');
end;
Form3.Show;
//Test_Dummy
MyBackupThread.Start;
Form3.FormProgress;
end;
from3是做了一个动画进度条,也可不要,至少主界面不会卡在那里不动了
lazarus要展示gif动画图片,需要安装gifanim组件,只需要把文件名赋值即可