02. april 2002 - 10:22Der er
19 kommentarer og 1 løsning
Ttimer
Jeg har erfaret at Ttimer opføre sig forskelligt afhængig af hvilken Windows platform man anvender. Jeg har lavet en lille forsøgs program der viser den tydelige forskel...
Ttimerens interval er sat til 10 Dvs. at i bliver forøget med 1 integer med interval 10. Her er resultat:
som I kan se er der en tydelig forskel. I Windows 98 køre Ttimer meget langsommere end på Windows 2000! Når i er lig med 400, i Windows 2000, er der gået 6 sekunder. Den samme tid som det Ttimer at runde 100 i Windows 98. Hmmm... hvorfor? og hvordan kan jeg gøre Ttimer "stabil"?
(********************************************* Changing the Enabled property calls either Start or Stop protected methods. *********************************************) procedure TThreadTimer.setEnabled( b: boolean ); begin if b then Start else Stop; FEnabled := bRunning; end;
(********************************************* Starting the timer creates an instance of TTimerThread and launches the thread. *********************************************) procedure TThreadTimer.Start; begin if bRunning then Exit; bStop := false; if not (csDesigning in ComponentState) then begin with TTimerThread.CreateTimerThread( self ) do begin Priority := FPriority; Resume; end; end; bRunning := true; end;
(********************************************* Stopping the timer just sets the stop flag to true, the TTimerThread's Execute method will then end and the thread will be destroyed. *********************************************) procedure TThreadTimer.Stop; begin bStop := true; bRunning := false; end;
(********************************************* Execute method for the spawned thread. Just repeats while the timer is enabled, and calls the timer object's OnTimer event. *********************************************) procedure TTimerThread.Execute; var SleepTime, Last: integer; begin while not tt.bStop do begin Last := timeGetTime; Synchronize( DoExecute ); SleepTime := tt.FInterval - ( timeGetTime - Last ); if SleepTime < 10 then SleepTime := 10; sleep( SleepTime ); end; end;
(********************************************* This method is called within the TTimerThread's Execute, using the Synchronize method. This is because we need to call the event handler from the main VCL thread. *********************************************) procedure TTimerThread.DoExecute; begin with tt do begin if Assigned( FOnTimer ) then FOnTimer( tt ); end; end;
procedure Register; begin RegisterComponents( 'Borrisholt', [TThreadTimer] ); end;
Der er lige et andet lille (mærkligt) problem... Når jeg afspiller en CD, hvilket jo ikke burde tage ret mange af computerens resourcer, så er hverken TThreadTimer eller TTimer stabile under Windows 98 men i Windows 2000 køre det ok... Jeg ved ikke præcis, hvor skoen trykker, om det er mit OpenGL grafik eller Win32 API kald der er årsagen... måske du kunne hjælpe med det?
Med andre ord... hvis du med sikkerhed ved at det ikke er Win32 API Kald der kan være årsagen, så må det jo mit OpenGL - jeg har nemlig hørt en lille fugl synge om at du ikke er den store 3D HAJJJJ *G*
Jeg tænkte på om du eventuelt var interesseret i at se mit lille 3D projekt? - som din TThreadTimer har været skyld i at den nu køre stabilt både under WinNT og Win32...
en Tråd ? Det er en klasse der arver fra TThread !
Jens B
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.