unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,SyncObjs, StdCtrls;
type
TMyThread =
CLass(TThread)
protected
procedure Execute;
override;
public
constructor Create( CreateSuspended : Boolean );
destructor Destroy;
override;
End;
TForm1 =
class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
FCS ,FCS2: TCriticalSection;
txt:
String;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
tc:Cardinal;
begin
FCS.Enter;
txt := '
Button1';
tc := GetTickCount;
while GetTickCount < (tc + 5000)
do Application.ProcessMessages;
Showmessage(txt);
FCS.Leave;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TMyThread.Create(false);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FCS := TCriticalSection.Create;
FCS2 := TCriticalSection.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FCS.Free;
FCS2.Free;
end;
{ TMyThread }
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
inherited;
FreeOnTerminate := true;
end;
destructor TMyThread.Destroy;
begin
inherited;
end;
procedure TMyThread.Execute;
begin
inherited;
// das liefert Thread als Ergebnis in
//Showmessage von Button1Click
FCS2.Enter;
txt := '
Thread';
FCS2.Leave;
// das liefert das erwartete Ergebnis in
//Showmessage von Button1Click
{
FCS.Enter;
txt := 'Thread';
FCS.Leave;
}
end;
end.