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.
Edge Triggered event,
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:
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;
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
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
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:
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?
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:

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;
Son Güncelleme := 18:28
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
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
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:
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.
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.