How to avoid GUI freeze when calling Beginthread API?
Below just a simple race between 2 button in 2 threads,

and this will freeze other components on the form.

<pre><code>
procedure moveButton1();
var
  I: Integer;
begin
  for I := 0 to 6000 do
    Form1.Button1.Left := Form1.Button1.Left - 1;
  Form1.Caption := 'Button1 won!';
  EndThread(0);
end;

procedure moveButton2();
var
  I: Integer;
begin
  for I := 0 to 6000 do
    Form1.Button2.Left := Form1.Button2.Left - 1;
  Form1.Caption := 'Button2 won!';
  EndThread(0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  thread1, thread2,tick : Integer;
  id1, id2 : LongWord;
begin
  thread1 := BeginThread(nil,
                         0,
                         Addr(moveButton1),
                         nil,
                         0,
                         id1);

  thread2 := BeginThread(nil,
                         0,
                         Addr(moveButton2),
                         nil,
                         0,
                         id2);
  CloseHandle(thread1);
  CloseHandle(thread2);
end;</pre></code>


How to avoid GUI freeze when calling Beginthread API?
===

Below just a simple race between 2 button in 2 threads,

and this will freeze other components on the form.

<pre><code>
procedure moveButton1();
var
  I: Integer;
begin
  for I := 0 to 6000 do
    Form1.Button1.Left := Form1.Button1.Left - 1;
  Form1.Caption := 'Button1 won!';
  EndThread(0);
end;

procedure moveButton2();
var
  I: Integer;
begin
  for I := 0 to 6000 do
    Form1.Button2.Left := Form1.Button2.Left - 1;
  Form1.Caption := 'Button2 won!';
  EndThread(0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  thread1, thread2,tick : Integer;
  id1, id2 : LongWord;
begin
  thread1 := BeginThread(nil,
                         0,
                         Addr(moveButton1),
                         nil,
                         0,
                         id1);

  thread2 := BeginThread(nil,
                         0,
                         Addr(moveButton2),
                         nil,
                         0,
                         id2);
  CloseHandle(thread1);
  CloseHandle(thread2);
end;</pre></code>

