RAD Studio [my sample] When use Thread.Queue or Thread.ForceQueue, mainly in mobile projects - Android is my case!

emailx45

Местный
Регистрация
5 Май 2008
Сообщения
3,571
Реакции
2,438
Credits
573
[my sample] When use Thread.Queue or Thread.ForceQueue to "queue" your commands, mainly in mobile projects - Android is my case!
[SHOWTOGROUPS=4,20]
Testing-Thread-Queue-and-Force-Queue.png


Here, im using my main thread for tests!

Код:
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.

hug
[/SHOWTOGROUPS]
 
Последнее редактирование: