[Delphi] Loop te heavy en timer te slow

Pagina: 1
Acties:

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Beste GoTters,

Ik ben een beginner met Delphi, maar ik ben op een probleem gestuit die geen help kon oplossen.
Ik heb een stukje code, dat elke keer iets moet checken. Dit moet ie in totaal 1 miljard keer gaan doen. En daar zul je misschien al denken, *ai*.
Iig, ik kan er niet omheen, en dat is ook de essentie van het programma.

Ik heb het eerst met een for loopje geprobeerd. Dat werkt idd perfect. Er kleeft alleen een groot probleem aan. Tijdens de loop laat ik een paar labels veranderen en zo, maar dat doet ie niet. Dat komt omdat het programma 100% van mijn cpu verlangt, en is dus constant op 100%. Het enigste wat wel werkt is een progressbar. Met Taakbeheer van Win kun je dan zien dat het programma niet meer reageert, maar hij is wel degelijk bezig.
Het komt er op neer, dat ik niets in die loop kan laten doen, omdat de loop 100% van de cpu verlangt.

Toen d8 ik, misschien wil het met een timer wel werken. En idd, werkt super. Alleen nu een groot nadeel. De interval van de timer kan max. op 1 ms worden ingesteld. Bedenk dat er dan dus 1 miljard ms nodig zijn, om de taak te voltooien. En ik heb niet echt zin om 277 uur te gaan w8ten... Het voordeel is wel, dat al mijn andere taken uitgevoerd worden.

Nu is mijn vraag, hoe ik dus een loop kan maken, die je eventueel kan onderbreken, en die niet 100% van de cpu verlangt, zodat er ook nog in die loop bepaalde dingen gedaan kunnen worden als captions veranderen e.d.

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Je kunt wel een loopje gebruiken, maar dan moet je aan het eind van je loop telkens even Application.ProcessMessages() aanroepen, dan krijgt je applicatie de kans om op de Paint Message te reageren.

Weet niet zeker of de syntax zo klopt, in C++ Builder is het in ieder geval Application->ProcessMessages(), die Delphi syntax heb ik wild gegokt :P

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Thnx, hij doet het idd met Application.ProcessMessages;. "()" hoefde niet.
Maar is het nu ook mogelijk om dan die loop te eindigen d.m.v. een stop button?

Ik heb wel iets anders gevonden op dit adres: http://www.delphipages.com/tips/thread.cfm?ID=138 , maar misschien kan het wel makkelijker :?

Nogmaals thnx Bigs voor je hulp ;)

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Ah, heb het al opgelost. Ik laat met een stop knop een variable aanmaken, en in de loop wordt gecheckt of die bestaat. Als die bestaat wordt er een abort; uitgvoerd.

Ik heb alleen geen idee of dit wel "netjes" is. Of kan ik beter i op max defineren zodat de loop stopt?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik zou zo iets gebruiken:
Delphi:
1
2
3
4
5
6
7
8
9
10
var I: Integer;
      Stop: Boolean;
begin
  for I := 1 to 10000 do begin
    if Stop then 
      break;
    
    // Do Something
  end;
end;

Je I veranderen ergens anders als in je for is niet erg netjes.

Nog beter is misschien een echte TThread. Je moet dan wel even opletten op synchronizatie.

We adore chaos because we like to restore order - M.C. Escher


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Kun je niet per timer periode 1000x die code uitvoeren? Dan heb je nog maar een kwartier nodig.

Poging 2 is om je workload per timer variabel te maken, als je op tijd klaar bent gaat die load omhoog, als je timer msg niet op tijd is (2 ms tussen timer periodes) gaat je worload omlaag. De truc hier is dat de standaard timer msgs worden samengevoegd als je er 2 in je msg queue hebt staan, wat dus gebeurt als je nog bezig was op het moment dat de eerste binnenkwam.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

ik zou een Thread gebruiken.. volgens mij is een timer in dit geval echt zwaar inefficient

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 11:56

Tomatoman

Fulltime prutser

  1. Bedenk wel dat een timer in de praktijk geen resolutie van 1 ms haalt. Het minimale interval dat je in de praktijk haalt, is niet kleiner dan 20 ms of zo.
  2. Een thread is in jouw geval ideaal om het rekenwerk te doen. Dan hoef je je tijdens het rekenen verder geen zorgen meer te maken over buttons die niet reageren of dat het venster niet meer versleept kan worden. Kijk voor een voorbeeldprogramma maar eens naar een van de met Delphi meegeleverde demo's: DelphiX\Demos\Threads\thrddemo.dpr

Een goede grap mag vrienden kosten.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-08 19:49

Creepy

Tactical Espionage Splatterer

LordLarry schreef op 31 december 2002 @ 09:56:
Je I veranderen ergens anders als in je for is niet erg netjes.
Sterker nog: Delphi laat het niet eens toe.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1