Edge Triggered event,

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Edge Triggered event,

Mesaj gönderen incal99 »

Merhaba,


Bir değişken veya bit değeri 0 dan 1 a geçiş yaptığı zaman kenar tetiklemesini algılayıp bir event çalıştırabilen bir yöntem var mı delphi altında?

var position:bool;

Trigger_Rising_Edge(position)=TRUE THEN BEGIN END;

gibi.



Iyi çalışmalar.
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Kod: Tümünü seç

type
 ....
  private
    FPosition: Byte;
    procedure  SetPosition(const Value: Byte);
  public
    property Position: Byte read FPosition write SetPosition;
.....
implementation

procedure  SetPosition(const Value: Byte);
var
  andislemi: Byte;
begin
  andislemi := FPosition xor Value;
  if andislemi = 8 then //8 = 100
    ShowMessage('üçüncü biti niye değiştirdin?? Özel bir sebebi var mı'); 
end;
vesselam.
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Mesaj gönderen incal99 »

Teşekkür ederim,
yanlız şöyle bir durum var, Bu fonksiyon kenar tetiklemesini değil bitin değişip değişmediğini gösteriyor, Yani kenar tetiklemesi oluştuktan sonra bir kereye mahsus bir event olmalı, zira sonrasında değişkenin değeri 1 olarak kalacağından bu fonsiyon yeni eventler üretmemeli, yada aynı sonucu vermemeli

Bunu şu anda bir state_değişen isimli ayrı bir state (durum değişkeniyle) hafızada tutuyorum, ama tabii böyle bir durumun direk olarak bir kereye mahsus bir event i oluşturulabilseydi kod daha şık olurdu.



Incal99
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Kenar veya seviye tetiklemesi için özel bir grammer yok. Delphi içinde buna özel bir rutin olduğunu da zannetmiyorumi. Olsa olsa bir kütüphane yardımı ile bu hallediliyordur. Bu işi, ilk başta assembler ile halletmek lazım, ki yapılabiliyorsa... Eğer assembler ile yapılabiliyorsan, delphi içine assembler kodu gömerek işini halledebilirsin. Ama tabi ben neye göre bu işi yapmak istediğini bilmiyorum. Paralel port için mi lazım?
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

:) Bir daha okuyunca kafama şöyle bir şey geldi. Zannedersem, sen kenarın yükseliştemi yoksa iniştemi olduğunu bulmak istiyorsun. Yine bunu bir property tanımlayarak bulabilirsin. Yukarıdaki verdiği kodu şu şekilde değiştriyorum.

Kod: Tümünü seç

type
TEdgeDirection = (up, down);
 ....
  private
    FPosition: Byte;
    FEdgeDircetion: TEdgeDirection
    procedure  SetPosition(const Value: Byte);
    procedure SetEdgeDirection(const Value: TEdgeDirection);
  public
    property Position: Byte read FPosition write SetPosition; 
    property EdgeDirection: TEdgeDirection read FEdgeDirection write SetEdgeDirection;
.....
implementation

procedure  SetPosition(const Value: Byte);
var
  andislemi, kontrolbiti: Byte;
begin
  andislemi := FPosition xor Value;
  kontrolbiti := FPosition xor 8;
  if (andislemi = 0) and (kontrolbiti = 1)  then //sadece 3. bit için kontrol ediyorum.
    EdgeDirection := down
  else if (andislemi = 1) and (kontrolbiti = 0) then
    EdgeDirection := up
  else
    //Seviye tetiklemesi olmuştur.
end; 

procedure SetEdgeDirection(const Value: TEdgeDirection);
begin
  FEdgeDirection := Value;
  ShowMessage('Edge tetiklemesi olmuştur bilginize:' + EnumToStr(Value));
end;
gibi...

Son Güncelleme := 18:28
incal99
Üye
Mesajlar: 23
Kayıt: 20 Eki 2005 02:33

Mesaj gönderen incal99 »

Aslında durum şöyle,

150 adet tank var , bunların içine rasgele olarak insanlar birşeyler koyup çıkartılyorlar, tanka her malzeme girişinde bir SQL kaydı gerekiyor, ve aynı zamandada her çıkışında bir kayıt yazmak gerekiyor. 150 adet tank olduğu için 150 ye kadar bir tarama yapıp for döngüsü ile , herbir tankta şart oluşmuşsa bir SQL command çalıştırmayı düşünüyorum fakat problem şu:


Eğer hakikaten 150 banyonunda başına birileri gelip sıklıkla malzeme indirip çıkartırsa , 150 lik tarama döngüsü içinde aynı anda belkide 8-10 kayıt arka arkaya yazılması gerekecek, işte bu yüzden brute-force döngü yerine daha multi-threaded olabileceğine inandığım , event yapısını kullanmak istiyorum, Yoksa programın response time değeri çok düşecek.


Burada timer komponentini kullanıp kontrol döngüsünü onun içine yazmak en kolay çözüm gibi ama eğer işler ters giderde 8-10 tane yazma işlemi timer içine koyduğum taramanın içinden çağrılırsa, program temiz bir yapıda olmaz gibi geliyor,

Aslında eskiden en iyisi bu iş için 2 process yaratıp birbirleriyle semaphore gibi birşeyle haberleştirmek. Ama bunu nasıl yapabileceğimi şu an tam kestiremiyorum.

Umarım problemimi tam olarak anlatabilmişimdir.


Incal99
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Tabi biz buradan sizin anlattığınız kadarı ile tahmin etmeye çalışıyoruz. Ben de acizane anladığım kadarı ile fikrimi belirteyim.
Bildiğiniz gibi bir forumda bazen onlarca ve yüzlerce bileşen oluyor ve çoğunun benzer olaylarında benzer işler yapılması gerekiyor. Bu durum için gerek Delphi'de olsun gerekse .Net ve diğer sistemlerde olsun event'lar için genelleştirilmiş parametreler kullanılır. Bu Delphi'de genelde eventlarda gördüğümüz "Sender: TObject" tarzı bir parametredir. Mesela 100 adet button'nun onclick olayını tek bir prosedürel metoda bağlayarak, bütün işlemeleri o tek olan metodda işlemek daha rahat olmaktadır. Bunun için de hangi butonun tetiklendiğini anlamak için switch/case ile Sender parametresi kontrol edilir.
Bu mantık ile her bir tankı ifade edecek bir sınıf olabilir. Ve bu sınıfta belli koşullarınız sağlayınca tetiklenebilecek bir event olabilir. Ve bu event Sender gibi tek bir parametre alabilir. 150 adet tank bu sınıftan üretilmiş olan nesneler olacaktır bu mantığa göre. Ve her bir tankın da istediğimiz event tetikçisi sadece tek bir metoda işaret edecek şekilde ayarlanır. Böylelikle sadece bir tankta gerçekleşecek olan şart sınıftaki olay tetikçisini Sender parametresi ile birlikte harakete geçirecek ve bu olay tetikçisine atanmış olan metodumuz çalışacaktır. Bu yüzden kaç tane tank olursa olsun çalıştırılacak olan metod bir tanedir. Ve bu tek olan metod içinde de case ile Sender parmetresi ayrıştırılarak işlem görür.
Bu aslında klasik event mantığı. Semafora ve ek kanal sistemine ihtiyaç yok. Eğer event'lar hakkında daha fazla bilgi almak istersen şuraya bakabilrsin(Türkçe): http://www.diyezon.com/?p=40 burada bununla ilgili bir başlık bulunmakta.

vesselam.
Cevapla