In using threading/PPL to enhance performance of an enterprise FMX app, I experienced some issues but could not find explanations for. Here is a simplified program to show what the issues are:
Form content
object Form1: TForm1
FormFactor.Devices = [Desktop]
object Label1: TLabel
Text = 'Time'
end
object Label2: TLabel
Text = 'Timer state'
end
object Button1: TButton
Text = 'Start (Normal)'
OnClick = Button1Click
end
object Button2: TButton
Text = 'Start (Task)'
OnClick = Button2Click
end
object Button3: TButton
Text = 'Start (AnonymThread)'
OnClick = Button3Click
end
object Timer: TTimer
Enabled = False
OnTimer = TimerTimer
end
end
Form code
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Timer: TTimer;
procedure TimerTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses System.Threading;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer.Enabled:= False;
Label1.Text:= 'Time (Normal)';
Timer.Enabled:= True;
Label2.Text:= 'Timer ON (Normal)';
// Result: All above and OnTimer OK
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer.Enabled:= False;
Label1.Text:= 'Time (Task)';
TTask.Run(
procedure
begin
Timer.Enabled:= True;
Label2.Text:= 'Timer ON (Task)';
end);
// Result: All above OK but no OnTimer
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Timer.Enabled:= False;
Label1.Text:= 'Time (AnonymThread)';
TThread.CreateAnonymousThread(
procedure
begin
Timer.Enabled:= True;
Label2.Text:= 'Timer ON (AnonymThread)';
end).Start;
// Result: ThreadProc may/may not fully run (But Timer.Enabled:= True seems always executed) and no OnTimer
end;
procedure TForm1.TimerTimer(Sender: TObject);
begin
Label1.Text:= DateTimeToStr(Now);
end;
end.
Note: In each button's OnClick I have written the consequent result.
Could any fellow Delphi programmer help me to understand why and, possibly, what to do (Using Threading/PPL, of course)? Thank you in advance.