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
  kod timer icinde bir kere islesin sadikacar60 5 269 30-04-2024, Saat: 17:22
Son Yorum: sadikacar60
  or komutu hakkinda sadikacar60 1 159 12-04-2024, Saat: 17:17
Son Yorum: sso
  AES Şifreleme Hakkında tmrksmt 18 1.773 14-02-2024, Saat: 10:42
Son Yorum: tmrksmt
  TDictionary kullanımım hakkında yhackup 3 503 09-02-2024, Saat: 15:58
Son Yorum: SimaWB
  TfrxReport Rapor dizaynı hakkında yhackup 2 313 24-01-2024, Saat: 11:35
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi