lazarus开发界面程序用线程显示进度条

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

你可能感兴趣的:(lazarus,开发语言,pascal)