16. juni 2007 - 16:39Der er
15 kommentarer og 1 løsning
tråde på multiprocessor computer
Hej,
Nu har jeg fornylig fået en ny laptop med 2 CPU'er og jeg har derfor omskrevet en nogle procedure så at de kan køre som tråde for at udnytte begge processor på samme tid.
Jeg started med at lave nogle små eksempler og det virkede fint. Begge processor blev brugt fuldt ud.
Mit problem er nu at når jeg laver tråde som begge tilgår et stort data set (de læser kun) som er i hovedprogammet så køre programmet super langsomt og bruger ikke CPU'erne fuldt ud.
Kan dette problem løses uden at lave en kopi af data for hver eneste tråd?
Bruger du Syncronize når du læser ? hvis du gør er det sikkert derfor, hvis du bruger den, så venter du på din "hovedtråd" ( dit hovedprogram ) hvergang du tilgår data. For at løse det skal du selv styre din sync. delphi løsning mod vcl'en ( igen dit hovedprogram ) er ikke særlig efektiv, vcl'en er nemli' ikke født thread-safe og er aldrig blevet det :)
Øv, med den nye version går det godt nok hurtigere med 2 tråde end med en men de to cpu'er bruges ifølge task manager ikke fuldt ud. Trådene har fået højste prioritet.
Det er ikke sikker du kan få det til at køre bedre, man skal nok også ha en compiler der er lavet til at compilere til flere cpu'er osv. der er en del man skal tage højde for :), men sjovt at lege med og forske i.
Måske du kan lave en slags log, som du skriver i når en af trådene venter.
Prøv evt. at kigge lidt på den måde delphi håndterer tråde, nu ved jeg ikke om du bruger beginthread() eller du bare har lavet Tthread klasse, men som jeg skrev tidligere er delphi måde at håndtere dem på ikke helt hensigtmæssig :)
Nu har jeg oprettet alle globale variabler som threadvar da dette skulle sikre at der en kopi af data'erne for hver tråd men når jeg nu debugger min tråd så er min Tstringlist nil og alle mine integer værdier har værdien 0. Dette er selvom jeg har lavt en procedure der sætter alle avriabler inden tråden bliver kørt ("setvariables").
NewThreadSearch := ThreadSearch.Create(True); NewThreadSearch.FreeOnTerminate := True; NewThreadSearch.setvariables; setthreadpriority(GetCurrentThread,THREAD_PRIORITY_HIGHEST); try Inc(FThreadRefCount); NewThreadSearch.OnTerminate := form1.HandleTerminate; NewThreadSearch.Resume; except on EConvertError do begin NewThreadSearch.Free; end;
Det var ikke helt spildt indsats en tråd køre fint - om ikke andent så har jeg lært noget nyt :)
Det eneste problem er når jeg starter flere tråde så køre de ikke optimalt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.