Løkke

Tags:    delphi

Jeg har en løkke, som tager lidt tid at køre igennem. Problemet er, at CPU'en koger på 100% i de 4-5 sek. det tager. Er der en mulighed for at køre løkken langsommere igennem ? Skal der bare bruges en sleep() ? Og i så fald, hvor mange milisekunder er optimalt at bruge ?



7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Hvis blot han skal køre en enkelt funktion hvert 10. minut, så er den nemmeste løsning altså bare at tilføje Sleep(0); (der er ingen grund til at sætte det højere end 0, for så kan han jo højst udføre 1000 iterationer i sekundet) i slutningen af hans løkke - så vil han frigive mere tid til andre eventuelle programmer, der nu måtte have behov for det.

Eks:
Fold kodeboks ind/udKode 


Lidt info fra MSDN:

In particular, if you specify zero milliseconds, the thread will relinquish the remainder of its time slice but remain ready.


Kaldene til Sleep(0); vil (formentlig, da det er så lidt tid, vi snakker om her) ikke kunne mærkes, så Sleep burde sagtens kunne kalde i hver iteration - men man kan jo evt. altid kun udføre et sådant kald for hver 1000. eller 10.000. iteration, afhængigt af hvor mange iterationer, man udfører i sekundet.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 04/12-05 11:37:48 af Nicolai Lyster Fersner]



Jeg har en løkke, som tager lidt tid at køre igennem. Problemet er, at CPU'en koger på 100% i de 4-5 sek. det tager. Er der en mulighed for at køre løkken langsommere igennem ? Skal der bare bruges en sleep() ? Og i så fald, hvor mange milisekunder er optimalt at bruge ?


Man kan måske også bruge Application. processmessage inde i løkken, det betyder at application ikke hænger.
Et Eks.

For I := 1 to 10000 do
Begin
.....loop commandoer her....
----
---

if (i mod 100) = 0 then Apllication.processmessage
EnD;

Men husk at begynd Ontimer med
timer1.enabled := false;
og slut ontimer med
Timer1.enabled := true;

Bare for en sikkerheds skyld.

mine freeware og shareware programmer : http://www.veloci.dk

Mine Freeware spil : http://www.nino.dk/gamebiz & http://www.osirisgames.com



I de fleste tilfælde vil jeg mene at det ville være bedre at kigge på algoritmens udformning. Hvad skal du beregne der tager så lang tid?



I de fleste tilfælde vil jeg mene at det ville være bedre at kigge på algoritmens udformning. Hvad skal du beregne der tager så lang tid?


Det er ikke noget der skal beregnes. Jeg har en database med en masse data, som bliver opdateret hvert 10. minut. Og for at lave programmet med de funktioner det har, bliver den nødt til at køre hele databasen igennem i løkker, og da det er en rimelig stor database tager det meget af CPU-kræften i et lille stykke tid.

[Redigeret d. 03/12-05 23:53:38 af KnoX-]



Den 03-12-05 23:52 skrev KnoX- følgende:
-----------------------------------------------------------------------------
I de fleste tilfælde vil jeg mene at det ville være bedre at kigge på algoritmens udformning. Hvad skal du beregne der tager så lang tid?


Det er ikke noget der skal beregnes. Jeg har en database med en masse data, som bliver opdateret hvert 10. minut. Og for at lave programmet med de funktioner det har, bliver den nødt til at køre hele databasen igennem i løkker, og da det er en rimelig stor database tager det meget af CPU-kræften i et lille stykke tid.

[Redigeret d. 03/12-05 23:53:38 af KnoX-]
-----------------------------------------------------------------------------

hvis jeg har forstået det her korrekt, så er hovedproblemet at din computer fryser hvert 10. minut fordi databasen skal opdateres.

Der findes en event (kald det hvad du vil) der hedder OnIdle og den ligger under application.OnIdle, og det den gør er at når der er systemresurser til rådighed, så æder den dem. Men andre ord: ideologisk set burde det ikke gå ud over dine andre processor/miste timeslices.

Søren Klit Lambæk bruger den i sine artikler om spilprogrammering i delphi.

/Troels



Jeg har en løkke, som tager lidt tid at køre igennem. Problemet er, at CPU'en koger på 100% i de 4-5 sek. det tager. Er der en mulighed for at køre løkken langsommere igennem ? Skal der bare bruges en sleep() ? Og i så fald, hvor mange milisekunder er optimalt at bruge ?


Man kan måske også bruge Application. processmessage inde i løkken, det betyder at application ikke hænger.
Et Eks.

For I := 1 to 10000 do
Begin
.....loop commandoer her....
----
---

if (i mod 100) = 0 then Apllication.processmessage
EnD;

Men husk at begynd Ontimer med
timer1.enabled := false;
og slut ontimer med
Timer1.enabled := true;

Bare for en sikkerheds skyld.

mine freeware og shareware programmer : http://www.veloci.dk

Mine Freeware spil : http://www.nino.dk/gamebiz & http://www.osirisgames.com


Jeg har en Application.ProcessMessages, og synes nu ikke den hjælper det helt store. Jeg har ikke lige prøvet alt det andet endnu, og har ikke så meget tid i øjeblikket. Jeg skriver lige igen når jeg får kigget på det.




Hey igen. Jeg ved godt det er lang tid siden jeg har spurgt om dette, men har haft utrolig travlt. Jeg har brugt løsningen med Sleep(0) - selvom den stadig bruger CPU-kræften på en gang, men samtidig lader andre programmer komme først. Jeg siger mange tak :)



t