Timer objesi hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Timer objesi hakkında

Mesaj gönderen adelphiforumz »

s.a.
Timer Componenti neden 16 ms altındaki işlemleri yapmıyor bileniniz varmı?

Yaprığım deneme
Timer componentinin içerisinde i:=i+1 gibi bir işlem yapıyorum.
interval degerini 1 olarak tanımlıyorum
program 1 Saniye çalışıyor
ve sonuc her seferinden i = 64 çıkıyor.
bunun nedenini bilen varmı

i : i +1 işlemi 1 ms'den daha kısa sürüyor denedim.

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
dabaddah
Üye
Mesajlar: 167
Kayıt: 13 Mar 2008 04:42
Konum: istanbul

Re: Timer objesi hakkında

Mesaj gönderen dabaddah »

yazdığın kodu tam olarak göndersen sorunu çözmede daha yardımcı olur ben timer ile bayağı işlem yaptım az çok bir fikir çıkar yani işine yarayacak ama kodların tümünü gönder..
insanın özü tanımasına engel olan perdeleri;
1.kendini beden sanma
2.vehmî benlik
3.beş duyu blokajları
4.toplumsal şartlanmalar ve şartlanmaların oluşturduğu değer yargıları ve değer yargılarından gelen duygular
kişi bu perdelerden arınmadıkça göresel kozasında yaşar ve bir ipek böceği gibi kaynar kazana atılır.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Timer objesi hakkında

Mesaj gönderen adelphiforumz »

Kod: Tümünü seç

object Form1: TForm1
  Left = 222
  Top = 118
  Width = 199
  Height = 157
  Caption = 'Timer Test'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 10
    Width = 75
    Height = 25
    Caption = '0'
    TabOrder = 0
  end
  object Button2: TButton
    Left = 108
    Top = 8
    Width = 75
    Height = 25
    Caption = '0'
    TabOrder = 1
  end
  object Button3: TButton
    Left = 8
    Top = 42
    Width = 173
    Height = 23
    Caption = 'Test'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Timer1: TTimer
    Enabled = False
    Interval = 1
    OnTimer = Timer1Timer
    Left = 12
    Top = 68
  end
  object Timer2: TTimer
    Enabled = False
    Interval = 1
    OnTimer = Timer2Timer
    Left = 76
    Top = 70
  end
  object Timer3: TTimer
    Enabled = False
    OnTimer = Timer3Timer
    Left = 148
    Top = 70
  end
end

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Button1.Caption := IntToStr(StrToInt(Button1.Caption) + 1);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Button2.Caption := IntToStr(StrToInt(Button2.Caption) + 1);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Button1.Caption := '0';
  Button2.Caption := '0';
  Timer1.Enabled := True;
  Timer2.Enabled := True;
  Timer3.Enabled := True;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer2.Enabled := False;
  Timer3.Enabled := False;
end;

end.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
dabaddah
Üye
Mesajlar: 167
Kayıt: 13 Mar 2008 04:42
Konum: istanbul

Re: Timer objesi hakkında

Mesaj gönderen dabaddah »

kardeş yazdığın kodları olduğu gibi denediğimde butonların üzerindeki değerler 0 olarak kaldı sendeki gibi 16 falan olmadı buna göre;kodlarını şöyle düzenlediğimde sonuç buttonların üzerindeki değer 1 oldu yani timerler 1 milisaniye olarak çalıştı

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
begin
Button1.Caption := '0';
Button2.Caption := '0';
Timer1.Enabled := True;
Timer2.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var a:integer;
begin
a:=StrToInt(Button1.Caption);
Button1.Caption := IntToStr(a+1);
Timer1.Enabled := False;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var a:integer;
begin
a:=StrToInt(Button2.Caption);
Button2.Caption := IntToStr(a+1);
Timer2.Enabled := False;
end;
end.
senin kodundaki hata ise

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
begin
  Button1.Caption := '0';
  Button2.Caption := '0';
  Timer1.Enabled := True;
  Timer2.Enabled := True;
  Timer3.Enabled := True;
end;
buton 3'e tıklar tıklamaz butonların üzerine değerleri yazıyor kodun işlem satırı timer1' geldiğinde timer1'i çalıştırmıyor çünkü devam etmesi gereken satırlar var bu satırları bitirmeden diğer işlemlere geçmiyor yani thread görevi görmüyor bu nedenlede gecikme oluyor. anlattıklarına göre anladıklarım bu kadar yok daha farklı ise sorunun detaylı bir şekilde izah etki üzerinde çalışalım...

Allah kolaylık vere.
insanın özü tanımasına engel olan perdeleri;
1.kendini beden sanma
2.vehmî benlik
3.beş duyu blokajları
4.toplumsal şartlanmalar ve şartlanmaların oluşturduğu değer yargıları ve değer yargılarından gelen duygular
kişi bu perdelerden arınmadıkça göresel kozasında yaşar ve bir ipek böceği gibi kaynar kazana atılır.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Timer objesi hakkında

Mesaj gönderen adelphiforumz »

s.a.
dabaddah arkadaşım yardımcı olmaya çalışmışsın teşekkür ederim fakat sanırım sorumu tam ifade edememimişi.
senin örnek olarak düzelttiğin kod ile benim gönderdiğim kod arasında bir fak yok test ettim.
eğer senin örneğin son satırındaki timerları false etme satırını kaldırırsan sende göreceksin.
benim problememim timer interval değeri 16 ms. altında olduğunda timer objesi bunu dikkate almıyor asıl sorun burda başlıyor.
benim öğrenmek istediğim bunun nedenini ve çözümünü bilen varmı.
teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: Timer objesi hakkında

Mesaj gönderen akdatilla »

merhaba
Timer nesnesi interval özelliği ontimer olayını ms olarak minimum hangi aralıklara çalışacağını belirtir.
Ancak bu aralık çok düşük tutulduğunda, işlemcinin o an yaptığı diğer işlemler sebebi ile yükseliyor.
Timer objesi ile nasıl çözüm üretilebilir bilemiyorum ancak bu işi bir thread ile yapmanı öneririm.
Aşağıdaki örneği bir dene:

Kod: Tümünü seç

unit formthread;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type

  TProgressBarThread = class(TThread)
  private
    pb: TProgressBar;
    FStep: Integer;
  protected
    procedure Execute; override;
    procedure MoveTh;
  public
    property Step:Integer read FStep write FStep;
    constructor Create(Box: TProgressBar; AStep:Integer; ThreadPriority: TThreadPriority);
  end;

  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TProgressBarThread.Execute;
begin

    while true do begin
      Synchronize(MoveTh);
      Sleep(1);//bekleme aralığı burada belirtiliyor.
    end;

end;

procedure TProgressBarThread.MoveTh();
begin
  pb.Position := (pb.Position + FStep) MOD 100;///1 ms aralıkla yapılacak iş, buraya kendi komutunu girebilirsin
end;

constructor TProgressBarThread.Create(Box: TProgressBar; AStep:Integer;
                                      ThreadPriority: TThreadPriority);
begin
  inherited Create(False);
  Self.FStep := AStep;
  pb := Box;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     TProgressBarThread.Create(ProgressBar1,1,tpHigher{bu parametre değeri sayesinde thread yüksek öncelikli çalışıyor});
end;

end.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Timer objesi hakkında

Mesaj gönderen adelphiforumz »

aktadilla arkaşım ilgine teşekkürler
bende bu işlemleri thread ile nasıl yapabilirim diye bir çalışma yapıyordum
hatta az önce farklı comportları threadler ile ilgili nasıl yönetebilirim
bazı tereddütlerim vardı bu konuda bir başlık açmıştım.
iyi çalışmalar
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla