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...

