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 :)
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;
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?
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):
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;
Tak alle sammen, jeg bruger bare sleep, men det kan være jeg får brug for det andet gejl senere.
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.