/examples/multithreading/mainunit.pas
http://github.com/graemeg/lazarus · Pascal · 116 lines · 56 code · 23 blank · 37 comment · 3 complexity · 0054b692a212ce3fb777e4ba60d0742f MD5 · raw file
- {
- ***************************************************************************
- * *
- * This source is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This code is distributed in the hope that it will be useful, but *
- * WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * General Public License for more details. *
- * *
- * A copy of the GNU General Public License is available on the World *
- * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
- * obtain it by writing to the Free Software Foundation, *
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- ***************************************************************************
- Abstract:
- Demo to show, how to start a thread and how synchronize with the main
- thread.
- Important: The cthread unint must be added to the uses section of the .lpr
- file. See multithreadingexample1.lpr.
- }
- unit MainUnit;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, Forms, Controls, Graphics, Dialogs;
- type
- { TMyThread }
- TMyThread = class(TThread)
- private
- fStatusText: string;
- procedure ShowStatus;
- protected
- procedure Execute; override;
- public
- constructor Create(CreateSuspended: boolean);
- end;
- { TForm1 }
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- private
- public
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.lfm}
- { TForm1 }
- procedure TForm1.FormCreate(Sender: TObject);
- var
- MyThread : TMyThread;
- begin
- MyThread := TMyThread.Create(True); // With the True parameter it doesn't start automatically
- if Assigned(MyThread.FatalException) then
- raise MyThread.FatalException;
-
- // Here the code initialises anything required before the threads starts executing
- MyThread.Start;
- end;
- { TMyThread }
- procedure TMyThread.ShowStatus;
- // this method is only called by Synchronize(@ShowStatus) and therefore
- // executed by the main thread
- // The main thread can access GUI elements, for example Form1.Caption.
- begin
- Form1.Caption := fStatusText;
- end;
- procedure TMyThread.Execute;
- var
- newStatus : string;
- begin
- fStatusText := 'TMyThread Starting ...';
- Synchronize(@Showstatus);
- fStatusText := 'TMyThread Running ...';
- while (not Terminated) and (true {any condition required}) do begin
- //here goes the code of the main thread loop
- newStatus:='TMyThread Time: '+FormatDateTime('YYYY-MM-DD HH:NN:SS',Now);
-
- if NewStatus <> fStatusText then begin
- fStatusText := newStatus;
- Synchronize(@Showstatus);
- end;
- end;
- end;
- constructor TMyThread.Create(CreateSuspended: boolean);
- begin
- FreeOnTerminate := True;
- inherited Create(CreateSuspended);
- end;
- end.