<div dir="ltr"><div class="gmail_extra">Here's an example which calculates Pi forever in a thread. It's important to note a few things:</div><div class="gmail_extra"><br></div><div class="gmail_extra">1. Periodically check if the thread should stop by checking the Terminated property inside Execute</div><div class="gmail_extra">2. If you want to communicate with the user interface, such as refreshing the screen based on some calculations, use the Synchronize method to do so</div><div class="gmail_extra">3. Do not share data the thread is using in calculations with anything. If you need access to the data in somewhere else, use Synchronize and make a copy there.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">unit Main;</div><div class="gmail_extra"><br></div><div class="gmail_extra">{$mode delphi}</div><div class="gmail_extra"><br></div><div class="gmail_extra">interface</div><div class="gmail_extra"><br></div><div class="gmail_extra">uses</div><div class="gmail_extra">  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;</div><div class="gmail_extra"><br></div><div class="gmail_extra">{ TMainForm }</div><div class="gmail_extra"><br></div><div class="gmail_extra">type</div><div class="gmail_extra">  TMainForm = class(TForm)</div><div class="gmail_extra">    OutputLabel: TLabel;</div><div class="gmail_extra">    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);</div><div class="gmail_extra">    procedure FormCreate(Sender: TObject);</div><div class="gmail_extra">  private</div><div class="gmail_extra">    FThread: TThread;</div><div class="gmail_extra">  end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">var</div><div class="gmail_extra">  MainForm: TMainForm;</div><div class="gmail_extra"><br></div><div class="gmail_extra">implementation</div><div class="gmail_extra"><br></div><div class="gmail_extra">{$R *.lfm}</div><div class="gmail_extra"><br></div><div class="gmail_extra">{ TCalculatePiThread }</div><div class="gmail_extra"><br></div><div class="gmail_extra">type</div><div class="gmail_extra">  TCalculatePiThread = class(TThread)</div><div class="gmail_extra">  private</div><div class="gmail_extra">    FPiDigits: string;</div><div class="gmail_extra">  protected</div><div class="gmail_extra">    procedure Update;</div><div class="gmail_extra">    procedure Execute; override;</div><div class="gmail_extra">  end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">procedure TCalculatePiThread.Update;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  MainForm.OutputLabel.Caption := FPiDigits;</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">procedure TCalculatePiThread.Execute;</div><div class="gmail_extra">var</div><div class="gmail_extra">  Data: array[0..2801] of Integer;</div><div class="gmail_extra">  I, K, B, D, C: Integer;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  FreeOnTerminate := True;</div><div class="gmail_extra">  while not Terminated do</div><div class="gmail_extra">  begin</div><div class="gmail_extra">    C := 0;</div><div class="gmail_extra">    for I := Low(Data) to High(Data) do</div><div class="gmail_extra">      Data[I] := 2800;</div><div class="gmail_extra">    K := 2800;</div><div class="gmail_extra">    while K > 0 do</div><div class="gmail_extra">    begin</div><div class="gmail_extra">      K := K - 14;</div><div class="gmail_extra">      D := 0;</div><div class="gmail_extra">      I := K;</div><div class="gmail_extra">      while not Terminated do</div><div class="gmail_extra">      begin</div><div class="gmail_extra">        D := D  + Data[I] * 10000;</div><div class="gmail_extra">        B := 2 * I - 1;</div><div class="gmail_extra">        Data[I] := D mod B;</div><div class="gmail_extra">        D := D div  B;</div><div class="gmail_extra">        Dec(I);</div><div class="gmail_extra">        if I < 1 then</div><div class="gmail_extra">          Break;</div><div class="gmail_extra">        D := D * I;</div><div class="gmail_extra">      end;</div><div class="gmail_extra">      FPiDigits := Format('%.4d', [C + D div 10000]);</div><div class="gmail_extra">      Synchronize(Update);</div><div class="gmail_extra">      C := D mod 10000;</div><div class="gmail_extra">    end;</div><div class="gmail_extra">  end;</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">{ TMainForm }</div><div class="gmail_extra"><br></div><div class="gmail_extra">procedure TMainForm.FormCreate(Sender: TObject);</div><div class="gmail_extra">begin</div><div class="gmail_extra">  FThread := TCalculatePiThread.Create(False);</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);</div><div class="gmail_extra">begin</div><div class="gmail_extra">  FThread.Terminate;</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">end.</div><div class="gmail_extra"></div></div></div>