/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
At lave en tråd
Fra : Michael Vilhelmsen


Dato : 14-12-01 08:40

Hej

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 ?


--
Med venlig hilsen / Best Regards
Michael Vilhelmsen
Remove.NoSpam from email before replaying !





 
 
Thomas Rose (14-12-2001)
Kommentar
Fra : Thomas Rose


Dato : 14-12-01 19:43

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



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste