27-04-2024, Saat: 23:04
Aşağıda sizin için basit bir timer thread oluşturdum. Her 1 dakikada bir TimeOut isimli metod çağrılıyor. Aynı zamanda bir button daha ekledim ve o buttonun içine de 3 dakikalık ana thread'i bloklayan bir kod yazdım. Ana thread'iniz bloklu durumda iken dahi, yazdığımız thread TimeOut metodunu ana thread'in kuyruğuna bırakmaya devam eder. Yani zaman kaçırmazsınız. Ancak, ana thread'iniz ne zaman bloktan kurtulur ise TimeOut metodlarınız sırası ile hemen işletilir.
Denemek sizden
Denemek sizden
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) btnStart: TButton; btnStop: TButton; Memo1: TMemo; btnBlockMainThread: TButton; procedure btnStartClick(Sender: TObject); procedure btnStopClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnBlockMainThreadClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; fTimerThread : TThread = nil; implementation {$R *.dfm} procedure InternalAPCProc(Param : NativeUInt); stdcall; begin // end; procedure TimeOut; begin form1.Memo1.Lines.Add(TimeToStr(Time)); end; procedure StopThread; begin if Assigned(fTimerThread) then begin QueueUserAPC(@InternalAPCProc, fTimerThread.Handle, 0); fTimerThread.Terminate; fTimerThread.WaitFor; FreeAndNil(fTimerThread); end; // if Assigned(fTimerThread) then end; procedure StartThread; begin StopThread; fTimerThread := TThread.CreateAnonymousThread ( procedure var AResult : Cardinal; begin TThread.CurrentThread.FreeOnTerminate := false; while not TThread.CurrentThread.CheckTerminated do begin if SleepEx(1 * 60 * 1000, true) = WAIT_IO_COMPLETION then // 1 dakikada bir kontrol edelim Exit; TThread.Queue( nil, procedure begin TimeOut; end ); end; // while not TThread.CurrentThread.CheckTerminated do end ); fTimerThread.Start; end; procedure TForm1.btnBlockMainThreadClick(Sender: TObject); begin Sleep(3 * 60 * 1000); end; procedure TForm1.btnStartClick(Sender: TObject); begin StartThread; end; procedure TForm1.btnStopClick(Sender: TObject); begin StopThread; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin StopThread; end; end.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...