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.