Kod: Tümünü seç
procedure TForm1.KapatTimerTimer(Sender: TObject);
var
Saat, Kapat: TDateTime;
begin
Saat := Now;
Kapat := StrToTime(SaatComboBox.Text);
if Saat = Kapat then
begin
Showmessage('Kapandı');
end;
end;
Kod: Tümünü seç
procedure TForm1.KapatTimerTimer(Sender: TObject);
var
Saat, Kapat: TDateTime;
begin
Saat := Now;
Kapat := StrToTime(SaatComboBox.Text);
if Saat = Kapat then
begin
Showmessage('Kapandı');
end;
end;
Kod: Tümünü seç
function Bekle( cSureSn:Cardinal ):Cardinal;
Var
Bitis: Cardinal;
begin
Bitis := GetTickCount + (cSureSn*1000);
while GetTickCount < Bitis do
begin
Sleep(1);
Application.ProcessMessages;
end;
Result := GetTickCount - Bitis;
end;
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
Basla, Bitis:TTime;
Sapma : Cardinal;
begin
Basla := Now;
Sapma := Bekle(10);
Bitis := Now;
ShowMessageFmt('Başla: %s, Bitiş: %s'#13'Beklerkenki Sapma = %d milisaniye', [TimeToStr(Basla), TimeToStr(Bitis), Sapma]);
end;
Çok farklı ?brs yazdı:Selam evet dediğiniz gibi timer tam zamanı yakalamalı, bende timerin tam zamanı yakalayamadığını düşüyorum verdiğiniz örneği inceledim oradaki işlem çok farklı...
Kod: Tümünü seç
TScheduler = record
public
class procedure Schedule(const ADateTime : TDateTime; const AProc : TProc); static;
end;
{ TScheduler }
class procedure TScheduler.Schedule(const ADateTime: TDateTime; const AProc: TProc);
begin
TThread.CreateAnonymousThread(
procedure
type
TInt64Rec = record
Lo : DWord;
Hi : DWord;
end;
var
SysTime : TSystemTime;
Target,
FileTime : TFileTime;
I : Int64;
InternalTimer : THandle;
wYear,
wMonth,
wDay,
wHour,
wMinute,
wSecond,
wMilliseconds : Word;
begin
DecodeDateTime(ADateTime, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSeconds);
InternalTimer := CreateWaitableTimer(nil, false, nil);
SysTime.wYear := wYear;
SysTime.wMonth := wMonth;
SysTime.wDayOfWeek := 0;
SysTime.wDay := wDay;
SysTime.wHour := wHour;
SysTime.wMinute := wMinute;
SysTime.wSecond := wSecond;
SysTime.wMilliseconds := wMilliseconds;
SystemTimeToFileTime(SysTime, FileTime);
LocalFileTimeToFileTime(FileTime, Target);
TInt64Rec(I).Lo := Target.dwLowDateTime;
TInt64Rec(I).Hi := Target.dwHighDateTime;
SetWaitableTimer(InternalTimer, I, 0, nil, nil, false);
WaitForSingleObject(InternalTimer, INFINITE);
TThread.Synchronize(
TThread.CurrentThread,
procedure
begin
AProc;
end
);
end
).Start;
end;
Kod: Tümünü seç
procedure TForm1.Button2Click(Sender: TObject);
var
ADateTime : TDateTime;
begin
ADateTime := EncodeDateTime(2014, 12, 14, SpinEdit1.Value, SpinEdit2.Value, SpinEdit3.Value, 0);
TScheduler.Schedule(
ADateTime,
procedure
begin
form1.Memo1.Lines.Add('Occured at ' + DateTimeToStr(ADateTime));
end
);
end;
Kod: Tümünü seç
function Bekle(cSureSn: Cardinal): Cardinal;
var
Bitis: Cardinal;
begin
Bitis := GetTickCount + (cSureSn * 1000);
while GetTickCount < Bitis do
begin
Sleep(1);
Application.ProcessMessages;
end;
Result := GetTickCount - Bitis;
end;
procedure TForm3.Timer1Timer(Sender: TObject);
var
Basla, Bitis: TTime;
Sapma: Cardinal;
begin
Basla := Now;
Sapma := Bekle(0);
Bitis := StrToTime(SaatComboBox.Text);
if (TimeToStr(Basla) = TimeToStr(Bitis)) then
begin
Showmessage('Kapandı');
end;
end;
Kod: Tümünü seç
Var // genel var bloğu
say : INTEGER;
procedure TForm1.FormCreate(Sender: TObject);
var
t1,t2:TDateTime;
Saat, Dakika, Saniye, Salise: Word;
begin
say:=0;
t1:=StrToDateTime(SaatComboBox.Text); // kapanış tarihi ve saati
IF t1>Now THEN BEGIN
t2:=t1-now;
DecodeTime(t2, Saat, Dakika, Saniye, Salise);
SAY:=(Saat*60*60)+(Dakika*60)+Saniye;
END;
end;
// timer ın intervali pekte önemli değil 1 sn yada 5 sn olması pek fark etmez, milisaniye tutmaz ise sadece istediğiniz zamandan 5 sn sonra yada 10 sn sonra kapanır, ama kesin kapanır :)
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF SAY>0 THEN SAY:=SAY-1;
IF SAY<=1 THEN BEGIN // 1 ise zaman geldi işlemi yap
Showmessage('Kapandı'); // veya terminate
END; // 1 ise zaman geldi işlemi yap
end;