Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Thread Durdurma
#6
Thread'imiz içinde CreateWaitableTimer ile Timer oluşturmalıyız. 
SetWaitableTimer ile bu timer'ın ayarlarını yapmalıyız.
Sonrasında SleepEx ile beklemeye geçmeliyiz. 
SleepEx'i istediğimi zaman sonlandırabilmek için 2. parametresini True yapmalıyız.
SleepEx'ten çıkmak için QueueUserAPC ile thread'imize tanımladığımız bir APC'yi (Asynchronous Procedure Call) gönderebiliriz.


procedure TTimerThread.Execute;
var
  timerHandle: THandle;
 larg_int : LARGE_INTEGER;
begin
 timerHandle := CreateWaitableTimer(nil, False, 'WaitableTimer');
 larg_int.QuadPart := -9000000000;
 SetWaitableTimer(timerHandle, Int64(larg_int), 900000, @Callback, nil, False);
 while not Terminated do
   SleepEx(INFINITE, True);
 CloseHandle(timerHandle);
end;

procedure Callback(P: Pointer; H, L: LongWord); stdcall;
begin
  // Burada periyodik olarak yapılacak işlemler yazılacak
end;

SetWaitableTimer'ın 2. parametresi Timer'ın ne zaman başlayacağını belirtir ve 100 NANO saniye hassasiyettedir. Dilediğiniz bir tarih-saati belirtebileceğiniz gibi bizim örneğimizde olduğu gibi eksi değer kullanılırsa fonksiyon çağrıldıktan ne kadar zaman sonra Timer'ın tetikleneceği belirtilmiş olur. (Bizden istenen 15 dakika olduğu için yukarıdaki değer girilmiştir)
SetWaitableTimer'ın 3. parametresi ise periyottur. Bu parametre ise saniye cinsindendir ve 15 dakikaya göre ayarlanmıştır. 4. parametre ise Timer tetiklendiğinde çağrılacak fonksiyonu belirtir. Örnek Callback fonksiyonu yukarıda verilmiştir.

Threadimizin kullanımına örnek için bir form, üzerinde 2 buton ile deneme yapabiliriz:
type
 TForm1 = class(TForm)
   btnStart: TButton;
   btnStop: TButton;
   Memo1: TMemo;
   procedure btnStartClick(Sender: TObject);
   procedure btnStopClick(Sender: TObject);
 private
   TT: TTimerThread;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure APC(Param: Cardinal); stdcall;
begin
 //
end;

procedure TForm1.btnStartClick(Sender: TObject);
begin
 TT := TTimerThread.Create(True);
 TT.FreeOnTerminate := True;
 TT.Start;
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
 QueueUserAPC(@APC, TT.Handle, 0);
 TT.Terminate;
end;
There's no place like 127.0.0.1
WWW
Cevapla


Bu Konudaki Yorumlar
Thread Durdurma - Yazar: Tuğrul HELVACI - 08-11-2017, Saat: 15:05
Cvp: Thread Durdurma - Yazar: savasabd - 08-11-2017, Saat: 17:23
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 08-11-2017, Saat: 17:30
Thread Durdurma - Yazar: ismailkocacan - 08-11-2017, Saat: 22:15
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 09-11-2017, Saat: 13:39
Thread Durdurma - Yazar: SimaWB - 10-11-2017, Saat: 00:19
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 10-11-2017, Saat: 09:25
Thread Durdurma - Yazar: SimaWB - 10-11-2017, Saat: 09:51
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 10-11-2017, Saat: 10:12
Thread Durdurma - Yazar: esistem - 10-11-2017, Saat: 10:27
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 10-11-2017, Saat: 10:53
Cvp: Thread Durdurma - Yazar: Fesih ARSLAN - 10-11-2017, Saat: 10:58
Cvp: Thread Durdurma - Yazar: Tuğrul HELVACI - 10-11-2017, Saat: 11:02
Thread Durdurma - Yazar: uparlayan - 10-11-2017, Saat: 11:52
Thread Durdurma - Yazar: ismailkocacan - 10-11-2017, Saat: 20:04
Cvp: Thread Durdurma - Yazar: ssahinoglu - 06-07-2018, Saat: 23:06



Konuyu Okuyanlar: 1 Ziyaretçi