![]()  | 
			|||
| HSG | 
		    
  | 
		
Ein Timer soll mit Hilfe eines Threads geschrieben werden, der nach Ablauf einer
übergebenen Wartezeit piepst.
Es sind folgende Teilaufgaben zu lösen:
Folgende 'Model'-Unit wurde mit UMLEd im Verein mit Delphi erzeugt. Dabei ist zu beachten, dass die
Methode execute override gesetzt wird.
UNIT mTPiepsThread;
interface
//--------------------  ggf Uses-Liste anpassen !  --------------------
uses
  classes,  // für TThread
  sysUtils, // für sleep
  windows;  // für windows.beep
type
   TPiepsThread = CLASS(TThread)
     // weitere Attribute
     private
        dt : integer;
     // weitere Methoden
     protected
        procedure execute; override;
     public
        constructor create; virtual;
        procedure SetDt (pDt: integer); virtual;
        function GetDt : integer; virtual;
   end;
implementation
//+---------------------------------------------------------------------
//|         TPiepsThread: Methodendefinition
//+---------------------------------------------------------------------
//-------- execute (protected) -----------------------------------------
procedure TPiepsThread.execute;
begin
  sleep(dt);
  windows.beep(1000,500);
end;
//-------- create (public) ---------------------------------------------
constructor TPiepsThread.create;
begin
  inherited create(true); // CreateSuspended = true
  freeOnTerminate := true;
end;
//-------- SetDt (public) ----------------------------------------------
procedure TPiepsThread.SetDt (pDt: integer);
begin
  dt := pDt;
end;
//-------- GetDt (public) ----------------------------------------------
function TPiepsThread.GetDt : integer;
begin
  result := dt;
end;
end.
Es folgt die zugehörige GUI-Unit:
unit uPiepsThread;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mtPiepsThread;
type
  TForm1 = class(TForm)
    eDt: TEdit; lDd: TLabel; bLos: TButton;
    procedure bLosClick(Sender: TObject);
  private
    Pieps : TPiepsThread;
  public
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bLosClick(Sender: TObject);
begin
  Pieps := TPiepsThread.create;
  Pieps.SetDt(StrToInt(eDt.Text));
  Pieps.Resume;
end;
end.
Das Beispiel zeigt - aufbauend auf dem ersten Beispiel - wie ein Thread in einer
Dauer-Schleife arbeiten kann und wie man ihn beenden kann. Über ein wechselseitiges
Sperren der Buttons in der GUI kann man ein mehrmaliges Erzeugen des Threads verhindern.
Warum ist das wichtig?
Model-Unit:
UNIT mTPiepsThreadBeende;
interface
//--------------------  ggf Uses-Liste anpassen !  --------------------
uses
  classes,  // für TThread
  sysUtils, // für sleep
  windows;  // für windows.beep
type
   TPiepsThreadBeende = CLASS(TThread)
     // weitere Attribute
     private
     // weitere Methoden
     protected
        procedure execute; override;
     public
        constructor create; virtual;
   end;
implementation
//+---------------------------------------------------------------------
//|         TPiepsThread: Methodendefinition
//+---------------------------------------------------------------------
//-------- execute (protected) -----------------------------------------
procedure TPiepsThreadBeende.execute;
begin
  while not Terminated do;
  windows.beep(1000,500);
end;
//-------- create (public) ---------------------------------------------
constructor TPiepsThreadBeende.create;
begin
  inherited create(true); // CreateSuspended = true
  freeOnTerminate := true;
end;
end.
GUI-Unit:
unit uPiepsThreadBeende;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mtPiepsThreadBeende;
type
  TForm1 = class(TForm)
    bStart: TButton;
    bEnde: TButton;
    procedure bStartClick(Sender: TObject);
    procedure bEndeClick(Sender: TObject);
  private
    Pieps : TPiepsThreadBeende;
  public
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bStartClick(Sender: TObject);
begin
  bStart.Enabled := false; bEnde.Enabled := true;
  Pieps := TPiepsThreadBeende.create;
  Pieps.Resume;
end;
procedure TForm1.bEndeClick(Sender: TObject);
begin
  bStart.Enabled := true; bEnde.Enabled := false;
  Pieps.Terminate;
end;
end.