14. juli 2000 - 14:43Der er
10 kommentarer og 1 løsning
Timer-ting
Jeg vil gerne have, at mit program "gør" noget på et bestemt tidspunkt, f.eks. laver en showmessage. Det skal være sådan, at man selv kan oprette tidspunkter der så viser en showmessage. Delphis Timer har kun interval, og det er måske nok lidt beskidt at regne intervallet ud fra oprettelse frem til tidspunktet ;) Nogen der har en ide, eller et komponent ?
Du skal ganske rigtigt brugen TTimer fra Delphis komponent liste. Du skal så i koden til dit OnTimer event checkke for om klokken nu er det den skal være for at udløse en bestemt handling ... Hvis dne er det så kald en procedure der exekverer dit event
Eller du kan sætte ttimerns interval til at være det stykke tid der er indtil næste gang du vil udføre noget - og så udføre det i onTimer, hvor klokken faktisk er det rigtige..
Regner du rigtigt (forskellen mellem nu og hvornår du vil have din kode udført) er ttimere præcise ned til ca. 50 ms. Det kan svinge lidt.. Men det burde være okay til de fleste ting :o)
Hvis det bare er for at tjekke noget op imod klokken skulle et sekunds intervaller være ok ...
Du kan prøve det her ...
procedure TForm1.Timer1Timer(Sender: TObject); var h,m,s,hund : Word; begin DeCodeTime(Now,h,m,s,hund); if (h = 9) and (m = 37) and (s=0) then ShowMessage('Klokken er 9:37'); end;
Afhænight af hvor nøjagtigt du skal bruge dine alarmer kan du bare sætte intervallet ned til et minut ellers har jeg en timer der er implemteret i en tråd, den bruger ingen CPU kraft, så kan jeg bare den dig den ...
Borrisholt, det er fordi jeg er ved at lave et transportprogram, der skal lave en alarm, når der skal hentes bands (jazzmusikere). Hvis du vil sende implementationen af din tråd ville det være perfekt. Thomas@ding.dk Forresten er der også lige den ting, at jeg godt kunne tænke mig, at alarmen gik i gang selvom mit program er minimeret...hmm ideer ?
procedure TTimerThread.Execute; begin repeat // wait for time elapse if WaitForSingleObject(FStop, FInterval) = WAIT_TIMEOUT then // if time elapsed run user-event Synchronize(FOwner.DoTimer); until Terminated;
// Delete event object CloseHandle(FStop); end;
{ TThreadedTimer }
constructor TThreadedTimer.Create(AOwner: TComponent); begin inherited Create(AOwner);
destructor TThreadedTimer.Destroy; begin // Destroy thread // signal thread to terminate FTimerThread.Terminate; SetEvent(FTimerThread.FStop); // resume if stopped if FTimerThread.Suspended then FTimerThread.Resume; // wait and free FTimerThread.WaitFor; FTimerThread.Free;
inherited Destroy; end;
procedure TThreadedTimer.DoTimer; begin if Assigned(FOnTimer) then FOnTimer(self); end;
procedure TThreadedTimer.SetEnabled(Value: Boolean); begin if Value <> FEnabled then begin FEnabled := Value;
if FEnabled then begin // When enabled resume thread if FTimerThread.FInterval > 0 then begin SetEvent(FTimerThread.FStop); FTimerThread.Resume; end; end else // suspend thread FTimerThread.Suspend; end; end;
function TThreadedTimer.GetInterval: Integer; begin Result := FTimerThread.FInterval; end;
procedure TThreadedTimer.SetInterval(Value: Integer); begin if Value <> FTimerThread.FInterval then begin Enabled := False; FTimerThread.FInterval := Value; end; end;
function TThreadedTimer.GetThreadPriority: TThreadPriority; begin Result := FTimerThread.Priority; end;
procedure TThreadedTimer.SetThreadPriority(Value: TThreadPriority); begin FTimerThread.Priority := Value; end;
procedure Register; begin RegisterComponents('System', [TThreadedTimer]); end;
Det der med om dit program er minimeret eller ej har vel etnelig ikke nogeet med alarment at gører .. I dit Alarm event maximere du bare din application
Hmm, jeg er ikke helt med på programmet. er det et komponent jeg skal installere ? Jeg får ihvertfald en fejlmeddelse. Kan du ikke give et lille eksempel på, hvordan jeg benytter din udgave ?
Hmm, jeg er ikke helt med på programmet. er det et komponent jeg skal installere ? Jeg får ihvertfald en fejlmeddelse. Kan du ikke give et lille eksempel på, hvordan jeg benytter din udgave ?
eksemplet som Borrisholt viser er et component. gem programmet som Thdtimer.pas og installer det som et component. har prøvet det....virker
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.