Jump to content
Nick Blunda

Thread does not synchronize two times in macOS

Recommended Posts

Hi.
My project includes 2 Form units and a thread unit.
Form2 is opened in ShowModal mode, by TMyThraed, with click on Button1 in Form1.
When Button1 in Form2 launch thread for second time, thraed syncronize changing Label1 both in Form1 and Form2.
This work fine in Windows OS, but in macOS second synchronisation don't works (Labels remains empty).
Maby this is a wrong way to menage threads, but it seems to me make project code more ordered...

Below I report code of 3 project's units.

Someone have answare?


 

UNIT MyThread;

INTERFACE

USES
  System.Classes, System.SysUtils, System.UITypes, System.StrUtils,
  FMX.Dialogs, FMX.TYpes;

TYPE
  TMyThread = class(TThread)
  private
{ Private declarations }
  protected
    constructor Create;
    procedure Execute; override;
    procedure UpdateUI;
  end;

IMPLEMENTATION

USES
  Unit1, Unit2;

constructor TMyThread.Create;
Begin
  inherited Create(false);
  FreeOnTerminate:= true;
End;

procedure TMyThread.Execute;
Begin
{* THREAD CODE *}
  Sleep(1000);
  Synchronize(UpdateUI);
End; {Execute}

procedure TMyThread.UpdateUI;
Begin
  if not (Form2.Visible) then
     Form2.ShowModal
  else
     begin
     Form1.Label1.Text:= 'Thread FORM1 done!';
     Form2.Label1.Text:= 'Thread FORM2 done!';
     end;
End; {UpdateUI}

END.

---------------------------------------------------

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.Controls.Presentation, FMX.StdCtrls,
  MyThread;

TYPE
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    MyThread: TMyThread;
  public
  end;

VAR
  Form1: TForm1;

IMPLEMENTATION

{$R *.fmx}

USES Unit2;

procedure TForm1.Button1Click(Sender: TObject);
Begin
{* RUN THRAED *}
  MyThread:= TMyThread.Create(false);
End; {Button1}

END.

---------------------------------------------------

UNIT Unit2;

INTERFACE

USES
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls,
  Unit1, MyThread;

TYPE
  TForm2 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    MyThread: TMyThread;
  public
    { Public declarations }
  end;

VAR
  Form2: TForm2;

IMPLEMENTATION

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
Begin
{* RUN THRAED *}
  MyThread:= TMyThread.Create(false);
End; {Button1Click}

END.

 

Edited by Nick Blunda

Share this post


Link to post
23 minutes ago, Nick Blunda said:

This work fine in Windows OS, but in macOS second synchronisation don't works (Labels remains empty).

Looks like a bug - In the TPlatformCocoa.ShowWindowModal method in FMX.Platform.Mac, it never calls CheckSynchronize inside of the loop.

 

In Delphi 12, modifying FMX.Platform.Mac.pas starting at line 4855:

      while True do
      begin
        CheckSynchronize; // <--- Add this line

Fixes it.

  • Like 3

Share this post


Link to post

Thank you very much!!!!!
Now it works fine.
In Delphi 11 line "while True do" is at position 4796.

 

  • Thanks 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×