15. oktober 2001 - 13:56Der er
16 kommentarer og 1 løsning
Vent et variabelt stykke tid
Hejsa Jeg har brug for et stykke kode, der er i stand til at vente et stykke tid. Noget i retningen af følgende.
procedure Hovedprogram var i:Integer; begin for i:=0 to 1000 do begin ..... Vent til næste minut rundes startende med næste minut der rundes.
..... gør en masse som ikke nødvendigvis varer et konstant stykke tid, men som ikke varer mere end et minut ..... end; end;
En mulighed er selvfølgelig at sleepe et par milisekunder og undersøge, om næste minut er rundet, men det er ikke præcis nok.
En anden mulighed er at benytte en WaitableTimer i en MsgWaitForMultipleObjects, men det ser umiddelbart ud til, at der er en fejl i SetWaitableTimeren, som Borland imidlertid siger er rettet. Jeg kan nu ikke se, at den er rettet :/
Er der en eller anden der har lyst til at tjene et par point på noget som efter min mening ligner en banal funktionalitet ?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Jo, men hvis jeg bruger sådan en laver du vel en event og den event er du stadig nød til på en eller anden måde at registrere i den første af de blokke jeg har skrevet i for lykken ... og hvordan gør man så det?
Så må du gøre noget andet .... Hvis du 100000000000000000000000000000000000000000% (Det er mange) på det tager under 1 minut Så kan du bruge en timer ...
Problemet kan løses med en timer hvis det er muligt på en linie i en procedure at vente på at en given event (her timeren) skydes af, men hvordan gør man det ?
Ja, det er en mulighed, men som tidligere nævnt bruger det for mange clockcykler. At bruge en sådan repeat until indtil et eller andet lægger systemet helt ned. Der må være en anden måde at gøre det på
Et lille hint, som jeg også har set på: WaitFor. Denne bruges til at synkronisere threads med og bruger ikke clockcykler på at vente. Jeg ved imidlerttid ikke, hvordan den kan implementeres midt i en procedure.
Så må du jo lave din en funktion der kan beregne hvor mange millisekunder der er tilbage af minuttet :
var etMinut : Real;
function MilliSeconds(Time: TDateTime): integer; var H, M, S, MS: word; begin DecodeTime(Time, H, M, S, MS); result := H * 3600000 + M * 60000 + S * 1000 + MS; end;
function TimeTowait : Integer; var timeStr : String; aTime : TDateTime; begin aTime := now + etMinut; timeStr := FormatDateTime(\'hh:mm:00\', aTime); aTime := StrToTime(timeStr); Result := MilliSeconds(aTime - Frac(now)); end;
Ok, det er nok fordi der ikke er noget i messagekø\'en, hvis der er bliver det udført, du kan f.eks. godt flytte rundt på dit vindue eller trykke på en knap, men du kunne jo f.eks. kombinere med en sleep();
Ja, men så er vi tilbage ved præcisionen for hvor lang tid skal der sleepes i?
Jeg acceptere Borris Holt\'s svar, selvom jeg havde håbet på noget lidt mere sofistikeret ala events med flag der bliver sat. At sleepe et udregnet antal ms løser imidlertid problemet og jeg kan komme videre med programmet. Tak for kampen drenge :)
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.