Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 13:56 Der 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 ?

MVH
    Franz Thomsen
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:00 #1
Sleep(X);
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:01 #2
Sorry, fik ikke læst spm.
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:02 #3
Kan du ikke bruge en alm Timer sat til et min.
Avatar billede borrisholt Novice
15. oktober 2001 - 14:06 #4
kan du ikke bare bruge en

Repeat ... until løkke

Jesn B
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:07 #5
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?
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:09 #6
repeat until +

sleepe et par milisekunder og undersøge, om næste minut er rundet, men det er ikke præcis nok og bruger for mange clockcykler

Avatar billede borrisholt Novice
15. oktober 2001 - 14:11 #7
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 ...

Jens B
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:12 #8
Læs tidligere svar
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:14 #9
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 ?
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:19 #10
Med en løkke og et flag i din timer

Timer1OnTimer
begin
  FRun := TRUE;
end;

begin
  while not FRun do Application.ProccesMessage;
  FRun := FALSE;
  ..
  ..

end;
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:33 #11
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å
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:36 #12
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.
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:36 #13
Ikke hvis du laver en application.proccesmessages
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 14:38 #14
Jeg har lige gjort det. CPU Usage i task manageren står på 100% i tiden, hvor der ventes
Avatar billede borrisholt Novice
15. oktober 2001 - 14:41 #15
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := TimeToStr(now) + \' ## \' + IntToStr(TimeToWait);
end;

initialization
  etMinut := StrToTime(\'00:01:00\')
end.

Jens B
Jens B
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:42 #16
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();
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 15:13 #17
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester