/ 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
Tråde - Synchronization / Main VCL tråd ??
Fra : SpookiePower


Dato : 11-01-03 13:19

Jeg sidder og læser om tråde men er nu stødt på noget jeg ikke kan
forstå.

Jeg har fundet dette på nettet -
http://www.pergolesi.demon.co.uk/prog/threads/Ch3.html
og sidder og læser afsnittet -
How does this work? What does Synchronize do?

og er stødt på denne linie -
Code which is invoked when synchronize is called can perform anything that
the main VCL thread might do.

Som jeg forstår synchronize så overdrager man en kodestump til Main
VCL-tråden
som denne tråd så udføre. Men når jeg læser den engelske text, så virker
det som om, at der udføres et stykke arbejde på samme måde som
main VCL tråde ville have gjort det, hvilket på mig lyder som om at det
slet ikke er main VCL tråden der udføre jobbet, men en helt anden ??

Er Main-tråden på billedet det samme som Main-VCL tråden ?

Håber mit spørgsmål er til at forstå, da jeg selv er lidt forvirreret.





 
 
Lars B. Dybdahl (11-01-2003)
Kommentar
Fra : Lars B. Dybdahl


Dato : 11-01-03 16:19

Hvis du aldrig laver separate threads, så har du kun en tråd, og det er main
tråden.

Hvis du laver separate threads, så må disse ikke lave noget som helst, der
har med VCL eller Windows GUI at gøre.

Hvis du fra en separat tråd vil gøre noget i VCL'en alligevel, så har du to
muligheder:

1) Implementer selv, at den kan sende en besked til hovedtråden, der så
udfører opgaven.
2) Lav en procedure i din separate tråd, og kald den med synchronize.

Synchronize sørger så for, at den procedure reelt bliver udført som en del
af hovedtråden, selv om den egentlig bliver kaldt i den separate tråd.

Jeg håber, at det er forklaring nok.

Lars.

--
Freelance programmør
Dybdahl Engineering: http://dybdahl.dk/
Delphi brugergruppen DAPUG: http://dapug.dk/


SpookiePower (11-01-2003)
Kommentar
Fra : SpookiePower


Dato : 11-01-03 17:34


"Lars B. Dybdahl" <Lars@dybdahl.dk> wrote in message
news:3e2035cd$0$11011$edfadb0f@dread12.news.tele.dk...
> Hvis du aldrig laver separate threads, så har du kun en tråd, og det er
main
> tråden.

Den er jeg med på.

> Hvis du laver separate threads, så må disse ikke lave noget som helst, der
> har med VCL eller Windows GUI at gøre.

også forstået

> Hvis du fra en separat tråd vil gøre noget i VCL'en alligevel, så har du
to
> muligheder:
>
> 1) Implementer selv, at den kan sende en besked til hovedtråden, der så
> udfører opgaven.

Mener du Messages ? det kender jeg ikke så meget til.

> 2) Lav en procedure i din separate tråd, og kald den med synchronize.

Her er jeg lidt forvirreret. Du siger at jeg skal lave en procedure i min
separate tråd.
Når jeg kigger på denne kode, fundet på den site jeg læser fra - så ser det
for mig
ud som om at Synchronize bliver kaldt fra Prime tråden(separat-tråden) og
kørt
af.....Prime tråden(TPrimeThrd.UpdateResults) ?? og ikke af MainVCL-tråden,
som jeg har forstået at den skulle.
Men skal det så forståes at når noget kaldes af Synchronize, så køres det
som
en del af Main VCL tråden, selv om proceduren hedder
TPrimeThrd.UpdateResults; ??


procedure TPrimeThrd.UpdateResults;
begin
PrimeFrm.ResultsMemo.Lines.Add(FResultString);
end;

procedure TPrimeThrd.Execute;
begin
.................
Synchronize(UpdateResults);
................
end;

end.







Lars B. Dybdahl (11-01-2003)
Kommentar
Fra : Lars B. Dybdahl


Dato : 11-01-03 22:28

Jeg tror at din forvirring kommer af at du ikke skarp får adskillet
begreberne:

Data: Gemmes i RAM, det er programmørens opgave at sikre, at to tråde ikke
skriver i de samme dataområder samtidigt. Der må gerne læses fra de samme
data samtidigt.

Kode/procedurer: Gemmes i RAM. Disse må gerne læses og udføres samtidigt,
dvs. to tråde må gerne være i samme procedure samtidigt.

Tråd: Forløbet for en ud af flere processorer. Består i virkeligheden af en
processors registre, en processor stak og processorens instruction pointer,
dvs. det CPU register, der angiver, hvor i programkoden processoren er ved
at udføre instruktioner.

Hvis du nærlæser ovenstående, finder du ud af, at en procedure ikke kan være
placeret "i en tråd". En procedure kan altid udføres af en hvilken som
helst tråd.

Det, som synchronize() gør, er at den på en eller anden mærkelig måde,
skjult for dig, meddeler hovedtråden (VCL tråden) at den skal udføre den
procedure, du angiver som parameter, og synchronize fortsætter så ikke, før
hovedtråden har gjort dette.

synchronize() er med andre ord en indkapsling af noget, du lige så godt
kunne have programmet selv.

Delphi's TThread er efter min mening meget mere kompliceret end den behøver
at være - og personligt kunne jeg heller aldrig drømme om at bruge TThread
i et Delphi for Linux program, da man her har et bedre og simplere
alternativ (fork). TThread blander nemlig data, programkode og tråd sammen,
og i virkeligheden er det meget mere kompliceret skruet sammen end det
umiddelbart ser ud til.

Jeg vil derfor anbefale dig følgende tommelfinderregler, for at gøre dit liv
nemmere:

- Alle procedurer der kaldes med synchronize() flytter du over i en anden
..pas fil end den, der indeholder din TThread klasse.
- I din TThread klasse lægger du kun ting, der skal udføres i den separate
tråd.
- Husk at sikre mod at to tråde skriver i de samme data i alle de
procedurer, som kaldes fra mere end en tråd.

Hilsen,

Lars.

--
Freelance programmør
Dybdahl Engineering: http://dybdahl.dk/
Delphi brugergruppen DAPUG: http://dapug.dk/


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste