Delphi開發安卓APP中使用Thread.Queue 或 Thread.ForceQueue 隊列Queue命令

Queue隊列在Delphi中還是經常要用到的,這是在主線程中的Android實例代碼,頸椎枕歡迎加入Delphi開發局QQ羣:32422310

unit uVCL_FormMain;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TfrmFormMain = class(TForm)
    btnThread_Queue: TButton;
    btnThread_ForceQueue: TButton;
    Memo1: TMemo;
    procedure btnThread_QueueClick(Sender: TObject);
    procedure btnThread_ForceQueueClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure prcMyLog(lText: string = '');
  public
    { Public declarations }
  end;

var
  frmFormMain: TfrmFormMain;

implementation

{$R *.dfm}

procedure TfrmFormMain.prcMyLog(lText: string = '');
begin
  if not(lText.IsEmpty) then
    Memo1.Lines.Add(lText);
  //
  Memo1.Lines.Add(format('%s - running my Memo Log code  <-----', [TimeToStr(now)]));
end;

procedure TfrmFormMain.btnThread_QueueClick(Sender: TObject);
begin
  //
  Memo1.Clear;
  //
  // forcing a "Queue" be used
  //
  // for test it, mark 2 break-point in this code:
  //
  TThread.ForceQueue(nil,
    procedure
    begin
      // command 0
      btnThread_Queue.Caption := 'btnThread_Queue ' + TimeToStr(now); { break point - later here! }
      //
      prcMyLog(format('%s - Queue - command 1', [TimeToStr(now)]));
      //
      prcMyLog(format('%s - Queue - command 2', [TimeToStr(now)]));
      //
      // Button1.Repaint;
    end);
  //
  prcMyLog(format('%s - Queue - command 3', [TimeToStr(now)]));
  //
  prcMyLog(format('%s - Queue - command 4', [TimeToStr(now)]));
  //
  prcMyLog(format('%s - Queue - command 5 = %s', [TimeToStr(now), StringOfChar('-', 40)]));
end; { break point - first occurrs here }

procedure TfrmFormMain.btnThread_ForceQueueClick(Sender: TObject);
begin
  //
  Memo1.Clear;
  //
  // in a main-thread, the call occurs imediatelly! - non-synchronization!
  //
  // for test it, mark 2 break-point in this code:
  //
  TThread.Queue(nil,
    procedure
    begin
      // command 0
      btnThread_ForceQueue.Caption := 'btnThread_ForceQueue ' + TimeToStr(now); { break point - first occurrs here! }
      //
      prcMyLog(format('%s - ForceQueue - command 1', [TimeToStr(now)]));
      //
      prcMyLog(format('%s - ForceQueue - command 2', [TimeToStr(now)]));
      //
      // Button1.Repaint;
    end);
  //
  prcMyLog(format('%s - ForceQueue - command 3', [TimeToStr(now)]));
  //
  prcMyLog(format('%s - ForceQueue - command 4', [TimeToStr(now)]));

  prcMyLog(format('%s - ForceQueue - command 5 = %s', [TimeToStr(now), StringOfChar('-', 40)]));
end; { break point - later here! }

procedure TfrmFormMain.FormCreate(Sender: TObject);
begin
  self.Position := TPosition.poScreenCenter;
  Memo1.Clear;
end;

end.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章