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/