Autor Beitrag
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: Mi 21.09.05 18:50 
also ich hab folgenden quellcode :
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TTimeSync = class(TThread)
  private
    FLabel: TLabel;
    procedure UpdateVCL;
  public
    procedure Execute; override;
    property TimeLabel: TLabel read FLabel write FLabel;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TTimeSync.Execute;
begin
  while not Terminated do
  begin
    Synchronize(UpdateVCL);
    Sleep(1000);
  end;
end;

procedure TTimeSync.UpdateVCL;
begin
  if Assigned(FLabel) then
    FLabel.Caption := TimeToStr(Now);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with TTimeSync.Create(True) do
  begin
    FreeOnTerminate := True;
    Priority := tpHigher;
    TimeLabel := Label1;
    Resume;
  end;
end;

end.


den hat sprint in einem thread gepostet. hab das ganze ma bei mir ausprobiert und es geht auch. allerdings seh ich noch nicht wirklich durch. da ich auch mit threads anfange und erstma das tthread objekt verwenden möchte würde ich den quelltext gern verstehn.
was ich verstanden hab is dass in dem thread ne schleife läuft die beim starten des progs gestartet wird und in flabel.caption wird die zeit geschrieben.

was ich nicht verstehe ist wie diese caption jetzt in die caption von label1 kommt, da das über property funzt und ich da nicht durchseh. ich hab mir schon den crashkurs delphi durchgelesen und das tut zu threads von jemand hier aus dem forum.

allerdings blick ich echt net wie das mit dem read und write läuft dass die zeit, die im thread aktualisiert wird in die caption von label1 kommt.

wäre nett wenn mir das jemand kurz erklären könnte.

und synchronize is so das zweite problem was ich habe. irgendwie versteh ich noch nicht wann ich immer synchronize aufrufen möchte. hatte mir ma nen thread geschrieben der ohne das auskam und das ging auch. allerdings wollte ich dann den wert von showmessage ändern (was im thread kam) udn dazu musste ich ne eigenschaft von form1 an den thread geben und das muss ja mit synchronize geschehen. allerdings hat er sich da totgeladen ohne das was kam. leider hab ich den quelltext nicht mehr snst würd ich den posten aber wäre nett wenn mir jemand die beiden begriffe/fragen anhand des oberen quelltext erklären könnte

thx im vorraus

_________________
"Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
chaosben
Hält's aus hier
Beiträge: 10

Win 7 Professional 64bit
Delphi 2009 Professional
BeitragVerfasst: Do 22.09.05 13:05 
Hi!
Ich werd mal versuchen dir die Sache ein wenig näher zu bringen. :)

Zitat:
was ich nicht verstehe ist wie diese caption jetzt in die caption von label1 kommt, da das über property funzt und ich da nicht durchseh

Als erster Tip: Guck mal in die hilfe unter dem Stichwort "property". Da wird erklärt, wie man damit arbeitet. Als Kurz-Referenz kann man sagen: Eine property ist wie eine Member-Variable einer Klasse, nur das sie einiges mehr kann.
Durch das:
ausblenden Delphi-Quelltext
1:
TLabel read FLabel write FLabel					

dahinter, wird die Eigenschaft fest mit der Variable FLabel "verknüpft", so das man fast sagen könnte, das FLabel eine Art Alias für "FLabel" ist. Beide sind zu (fast)jeder Zeit gleichbedeutend, haben den gleichen Wert und können gleich verwendet werden.
In diesem speziellen Fall merkt man sich in dem TTimeSync unter FLabel einen Verweis auf das echte Label, das auf dem Form liegt. Das passiert beim Anlegen des Objektes durch
ausblenden Delphi-Quelltext
1:
TimeLabel := Label1;					

Dadurch kann der Thread dann später auf das Label zugreifen und z.B. dessen Caption setzen.

Zitat:
und synchronize is so das zweite problem was ich habe. irgendwie versteh ich noch nicht

Folgendes Problem:
Dein Thread läuft ja nun durch die CPU wie er will. Er ist dabei völlig unabhängig vom Hauptthread, der sich z.B. um das Formular und speziell in diesem Fall um das Label kümmert. Wenn deinem Thread jetzt einfällt, das er etwas mit den Resourcen des anderen Threads machen möchte, dann sollte das "synchron" passieren, also so, das es zu keinen Konflikten zwischen den beiden Threads kommt. Das betrifft vor allen Dingen Aktionen mit grafischen Elementen. Der Synchronize-Prozedur übergibst du als einzigen Parameter eine Member-Prozedur des Threads (In diesem Fall "UpdateVCL"). Damit wartet der TTimeSync-Thread darauf, bis der Hauptthread wieder in seine Message-schleife kommt und macht dann erst seine Änderunge. Als Gegen-Beispielt kannst du einfach in deinem Thread mal ne MessageBox aufmachen. Du wirst dich wunderen wieviele verschiedene Formen eine Messagebox haben kann. ;)

_________________
visit TheUnknownOnes