Zitat von
Daniel:
Und nun bitte zurück zum Thema - weiteres OffTopic in diesem Thread blende ich aus.
Wird gemacht. Ich habe zwei (hoffentlich nicht zu dumme) Fragen:
1.
Zitat von
Luckie:
Delphi-Quellcode:
unit Unit2;
interface
uses
SysUtils, Classes;
type
TTest =
class(TThread)
private
{ Private-Deklarationen }
protected
procedure Execute;
override;
end;
implementation
{ Wichtig: Methoden und Eigenschaften von Objekten in VCL oder CLX können
nur in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
Synchronize(UpdateCaption);
wobei UpdateCaption so aussehen könnte:
procedure TTest.UpdateCaption;
begin
Form1.Caption := 'In einem Thread aktualisiert';
end; }
{ TTest }
procedure TTest.Execute;
var
i: Integer;
s:
String;
begin
for i := 0
to 9999
do
begin
s := s + IntToStr(i);
end;
end;
end.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
TestThread: TThread;
procedure OnTerminate(Sender: TObject);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
TestThread := TTest.Create(True);
TestThread.OnTerminate := OnTerminate;
TestThread.Resume;
end;
procedure TForm1.OnTerminate(Sender: TObject);
begin
TestThread :=
nil;
end;
Okay, habe ich soweit verstanden... Ich habe es bis jetzt immer so gemacht, dass ich ein Object mit freeandnil freigegeben habe, nachdem ich es nicht mehr brauche. Funktioniert das jetzt auch noch, wo der Zeiger ja schon nil ist? Wenn nein, wie gebe ich den Speicher dann frei?
[edit]
kann man sich nicht auch einfach ein Feld im Thread Objekt erzeugen, welches mit true initialisiert wird und bei onTerminate auf false gesetzt wird? Diese könnte man dann ja
auch abfragen... Wiese macht man die Erkennung hier mit dem Zeiger?
[/edit]
2.
Zitat von
Schwedenbitter:
Delphi-Quellcode:
Procedure TTestThread.Ausgabe;
Begin
Form1.Label1.Caption:=S;
End;
Procedure TTestThread.Execute;
Var
I : Integer;
Begin
I:=0;
While (I<=MaxInt) And Not Terminated Do
Begin
S:=FormatFloat('#,##0',I); Synchronize(Ausgabe);
Inc(I);
End;
S:='Thread beendet.'; Synchronize(Ausgabe);
End;
Ist diese Verwendung von Synchronize mit
VCL Komponenten so richtig?
Vielen Dank