Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
timer kullanimi hakkinda
#11
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 Wink

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...
WWW
Cevapla
#12
tesekkurler hocam en ince detayina kadar inceleyecegim.
ihtiyacimi
snc:=MinutesBetween(_OacTime,nw);

seklinde hallettim ama formda bir timer kullanmadan kodla timer kullanmayi sayenizde ogrenecegim insallah
saygilar.
Ekmeğimi yazılımdan kazanmıyorum kendi halimde bir şeyler yapıyorum. 49 yaşında emekliyim.
İğne sokmadan yardımcı olacaksan başımın üstünde yerin var.

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  SQL Table Type parametre gecisi hakkında (Çözüldü) adelphiforumz 1 218 09-04-2026, Saat: 15:53
Son Yorum: adelphiforumz
  Video Oynatma Hakkında adelphiforumz 7 869 17-12-2025, Saat: 07:36
Son Yorum: mrmarman
  nduWlanAPI Kullanımı hakkında nurah 3 823 09-09-2025, Saat: 09:33
Son Yorum: RAD Coder
  AES Şifreleme Hakkında tmrksmt 25 5.952 06-09-2025, Saat: 22:12
Son Yorum: delphi.developer
  FMX de Tchart kullanımı mkucuktepe@msn.com 2 721 25-07-2025, Saat: 14:42
Son Yorum: mkucuktepe@msn.com



Konuyu Okuyanlar: