Hej Michael,
"Michael Vilhelmsen" <ccc37780.NoSpam@vip.cybercity.dk> wrote in message
news:_0iS7.3391$Q3.487547@news010.worldonline.dk...
> Jeg har siddet og kigget lidt på det der med tråde ?
> Jeg kan ikke helt få det til at virke.
>
> Hvordan laver jeg en tråd, som f.eks. ikke gøre andet end at tælle fra 1
til
> 1.000.000 og samtidigt skrive dette tal på en mainform ?
Tja, det er nok nemmest at illustrere gennem et eksempel: Først skal du have
lavet din egen tråd-klasse... i mit eksempel giver jeg den to lokale
variable: en tæller og en TLabel reference, foruden metoden UpdateLabel,
samt en constructor hvortil en TLabel reference overføres (fra formen) og
endelig en overskrevet version af Execute:
TMyThread = class(TThread)
private
FCounter : integer;
FLabel : TLabel;
procedure UpdateLabel;
public
constructor Create(aLabel : TLabel);
procedure Execute; override;
Constructoren nulstiller tælleren og gemmer referencen til label'en:
constructor TMyThread.Create(aLabel : TLabel);
begin
inherited Create(true); // Tråden kreeres i suspenderet tilstand
FLabel := aLabel;
FCounter := 0;
end;
UpdateLabel skal kun opdatere label'ens Caption:
procedure TMyThread.UpdateLabel;
begin
FLabel.Caption := IntToStr(FCounter);
end;
og Execute skal forøge tælleren, sørge for opdatering af label'en, og
desuden afslutte når tælleren når 1.000.000:
procedure TMyThread.Execute;
begin
while not Executed do
begin
inc(FCounter);
Synchronize(UpdateLabel);
if FCounter = 1000000 then
Terminate;
Sleep(33);
end;
end;
Bemærk at der omkring UpdateLabel anvendes Synchronize... kort sagt sørger
den for at synkronisere din tråd med applikationens hovedtråd (og dermed gør
opdateringer på formen trådsikre - vigtigt at huske). Tag evt. et kig i
Delphi's hjælp vedr. Synchronize.
Desuden har jeg placeret et kald til Sleep for at undgå, at tråden snupper
for megen CPU-tid; en sleep med 30 ms vil bevirke, at Execute udføres
omtrent 30 gange i sekundet (afhænger af hvor meget tid der ellers anvendes
i Execute).
Og for din Form's vedkommende, skal den blot oprette en instans af tråden
(og overføre en reference til en TLabel du har lagt på formen), og herefter
kalde Resume på tråden... og så skulle du være kørende.
Held og lykke,
Thomas
|