Avatar billede velle Nybegynder
13. marts 2002 - 19:45 Der er 5 kommentarer og
1 løsning

Forsinkelse

Hvordan laver man en forsinkelse. Jeg vil have delay på mine knapper, så der går 2 sec fra jeg klikker til de udfører resten af koden.

VH Velle
Avatar billede morten_s Nybegynder
13. marts 2002 - 19:55 #1
procedure TForm1.Button1Click(Sender: TObject);
begin
  Sleep(2000);
  ShowMessage('2. sek er lang tid når man venter');
  //Din kode
end;
Avatar billede dj Nybegynder
13. marts 2002 - 20:02 #2
var
  tid: integer;
begin
  tid := gettickcount;
  repeat
    application.processmessages;
  until gettickcount - tid > 2000;
  //din kode her
end;

I modsætning til Sleep blokker denne kode ikke din mainthread.
Dog bryder jeg mig ikke om busywaiting, så jeg ville nok foreslå du istedet kiggede lidt på Threads og foretog det derigennem.

Jeg kan også vise dig hvordan man laver en ordentlig timerfunktion der er 100% nøjagtig og som ikke benytter busywaiting, men hvis du kan bruge enten sleep eller den ovenstående kode til løsningen af dit problem er der vel ingen grund til at gå i detaljer :)

//DJ
Avatar billede hermandsen Juniormester
13. marts 2002 - 20:02 #3
Eller hvis du vil ha' at dit program skal "svare" samtidig kan du bare lave din kode i en timer!

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Interval := 2000;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ShowMessage('Nu er der gået to sekunder');
  //Resten af din kode...
  Timer1.Enabled := False;
{HUSK at stoppe timeren når proceduren er færdig, ellers vil den køre en gang til efter 2 sekunder!}
end;
Avatar billede hermandsen Juniormester
13. marts 2002 - 20:08 #4
Hvis det skal være PRÆCIST to sekunder, kan du eventuelt bruge en DXTimer fra DelphiX komponent-pakken, meeeeen... Helt ærligt... Om der går 2000 milisekunder eller 2020 milisekunder, er det virkelig så vigtigt?
Avatar billede dj Nybegynder
13. marts 2002 - 20:21 #5
Det jeg nok ville vælge for at undgå både busywaiting og for at dit program stadig svarer var at oprette en Thread hvor du har den kode som du vil køre når der trykkes på knappen. Ved tryk på knappen opretter du nu istedet denne thread og i threaden sætter du så Sleep(2000); så stopper du threaden i 2 sec. men mainthreaden i dit program bliver ikke påvirket af dette og svarer derfor stadig. Efter sleep kan du så indsætte den kode som du vil have kørt.

Til de interesserede er her koden til en uhyre præcis timer (bruges ofte i forbindelse med 3D programmering):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    TimerHandle : UINT;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure MyTimerProc(
  hWin : HWND; // handle to window
  uMsg : DWord; // WM_TIMER message
  idEvent : DWord; // timer identifier same as returned by SetTimer?
  CrntTime: TDateTime );// current system time
begin
  showmessage('Der gik lige præcis 2sec');
  //din kode her
  Killtimer(0,form1.TimerHandle);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TimerHandle := SetTimer(0,0,2000,@MyTimerProc); //de 2000 definerer tiden i ms
end;

end.

//DJ
Avatar billede velle Nybegynder
13. marts 2002 - 20:59 #6
Tak alle sammen, jeg bruger bare sleep, men det kan være jeg får brug for det andet gejl senere.
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

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel