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组件,只需要把文件名赋值即可