Ornekteki kodun sakincasi varmi?

Başlatan bunalmis, 11 Ocak 2010, 19:18:42

Klein

Doğrudan interrupt vektörlerine ulaşamıyorsan , çok mümün olduğunu sanmıyorum. Belki vardır ama ben bilmiyorum böyle bir yöntem.

z

Alıntı yapılan: "wsxwsx"hehe olmaz öyle şey. thread kullanmalisin.
çünkü o sırada butonun basilamaz. şekilde gorülmektedir.
durumu göstermek icin ornek yaptim....

Procedure islem yaparken bir baska buton clicklendiginde ilgili click rutini calissin demiyorumki. Clicklendimi clicklenmedimi bundan haberim olsun istiyorum.

Aklima boyle bir soru geldi ve appl.. proc..mess.. yada thread kullanmadan bir baska yontemini merak ediyorum.

(Bu clickleme islemi kuyruguna giriyor. Yani aradigim bilgi kayitlara girmis durumda)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

evet hocam bunu kesin yapabilirsin. buton kliklendiği zaman windows senin programına bir mesaj gönderir. o mesajı döngüden bağımsız bir şekilde yakalayıp haberdar olabilirsin. BUnu yapman içinde ayrı bir thread gerekir.  :D programpenceresi meşgulse bile, gelen mesajları alır, değerlendirir.
http://delphi.about.com/od/windowsshellapi/a/aa020800a.htm

z

Alıntı yapılan: "wsxwsx"evet hocam bunu kesin yapabilirsin. buton kliklendiği zaman windows senin programına bir mesaj gönderir. o mesajı döngüden bağımsız bir şekilde yakalayıp haberdar olabilirsin. BUnu yapman içinde ayrı bir thread gerekir.  :D programpenceresi meşgulse bile, gelen mesajları alır, değerlendirir

Hayir donguden bagimsiz değil dongu icindeyken haberdar olmak istiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

olmaz çünkü döngü içinde iken başka hiç bir şey yapılmamıştır. windowsun veya başka programların gönderdiği mesajlara hiç bakılmamıştır. onlara bakmak demek ap. proce. mes.  işletmek demektir.

application.ProcessMessages kodunun açılımı nedir? bu koda bakılacak , sade butonu klikini algılamak ile ilgili yer kırpılıp döngü içine yazılacak.
application.birAzProcessMessages gibi

Forms.pas dosyasından bunun içeriği görülebiliyor.

procedure TApplication.ProcessMessages;
var
  Msg: TMsg;
begin
  while ProcessMessage(Msg) do {loop};
end;

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;

Klein

İlk mesajınızdan sanki sistem apilerini kullanmadan nasıl yapılacağını soruyorsunuz diye düşündüm. bu yüzden taa kaynağa , donanım kesmelerine  gönderdim meseleyi.
Eğer Windows API'lerini kullanırsanız yaparsınız.

buttton1 döngüyü başlatıyor. button2 üzerinde farenin sol tuşuna basılıp bırakılınca,  sisteme 514 numaralı mesaj gönderiliyor. döngü içerisinde bu mesajı yakalayıp programı sonlandırıyoruz.  
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    msg:tmsg;
begin
     i:=0 ;
    while i<99999 do
     begin
        inc(i);
       if getmessage(msg,button2.Handle,0,0) then
        begin
          memo1.Lines.Add(inttostr(msg.message));
          if(msg.message = 514) then exit;
        end;
     end;
end;


EKLEME:
böyle de sadeleştirilebilir.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    msg:tmsg;
begin
     i:=0 ;
    while (i<99999)  and  (getmessage(msg,button3.Handle,513,517) = false ) do
    begin
        inc(i);
    end;
end;

Klein

Eğer hıza ihtiyacınız varsa , çıktıyı TLabel nesnesine almak yerine Doğrudan
Canvas'a yazmak daha hızlı bir çözüm olur.  Canvas'a yazılırken döngü içerisinde refresh'e ihtiyaç yok.
Örneğin
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    msg:tmsg;
    starttime,elapsedtime:integer;
begin
     i:=1;
     starttime:= gettickcount();
     label3.Caption:='';
    while (i<99999) and (peekmessage(msg,button3.Handle,514,514,PM_NOREMOVE)=false)do
    begin
        i:=i+1;
        canvas.TextOut(label3.Left,label3.Top,inttostr(i));
    end;
     elapsedtime:= gettickcount()-starttime;
     label1.Caption:= inttostr(elapsedtime);
end;


Bu kodun işlenmesi  563mS sürüyor.
Kodda  Label3.Left ve Top yerine sabit koordinat verildiğinde 484ms

Aynı şartlarda
   begin
        i:=i+1;
        label3.Caption:=inttostr(i);
        label3.Refresh;
    end;

Bu kodun işlenmesi 5031ms sürüyor. Yaklaşık 9 kat daha fazla.

Not: önceki mesajda  getmessage(....) olarak verilmiş fonksiyonun doğrusu yukarıdaki örnekte olduğu gibi peekmessage(....) olacak.  eğer mesaj beklenecekse , yani mesaj gelene kadar hiçbir işlem yapılmayacaksa o zaman getmessage kullanmak gerekiyor.

z

@Klein

- Soruma cevap olan API nin bu oldugu
- Button üzerinde farenin sol tuşuna basılıp bırakılınca, sisteme 514 numaralı mesaj gönderildigi

gibi bilgileri nereden buldun?

Peekmessage sayesinde windowsun islerine iyice karisabilir oldum.

Mesela islemi uzun suren bir dongude herhangi bir buton clicklendiyse, click rutini normalde procedureden cikinca yada app.process.messages ile oluyordu halbuki simdi butonun clicklendigini ogrenince clickeventinin cevaplandigi proceduru cagirabiliyoruz.

Bu da isletim sisteminin akisina bir bakima mudahale oluyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Hocam
Neyi nerede arayacağını bildiğin zaman bulmak pek sorun olmuyor.  Bu da biraz tecrübeyle oluyor.  
WIN32 API'lerinde birşey okumak istiyorsan "GET" ,  
yazmak istiyorsan "Post"  vardır  rutinin başlığında.
Bu her zaman böyle olmasa da çoğunlukla böyledir.  Konu mesaj olunca "Get" ve "Message" kelimelerini birleştirince gerisi çorap söküğü gibi gelir.
Delpide bazen VCL içerisinde kaynak kodları incelemekte fayda var.

wsxwsx  arkadaş "application.processmessage"  rutininin VCL deki kaynak kodunu vermiş. O kodu dikkatli incelemiş olsaydım hiç "GetMessage(..)" ile zaman kaybetmeden "PeekMessage(..)" ile işimi göreceğimi zaten görecektim.
Bu yüzden zaman buldukça SDK32 ve VCL kaynak kodlarına göz atmak , ne nasıl yapılmış görmekte fayda var.  

Mesaj numarasını nereden biliyorum?
Test için küçük bir rutin yazdım. gelen tüm mesajları bir memo nesnesine attım.  hangi eylemde hangi mesajın hangi şartlarda geldiğini tespit ettim.
Aslında bu mesajların hepsi "WM_XXXXXX" şeklinde tanımlıdır. Ama ben mouseclick için hangi tanım yapıldığını aramamak için bu yolu seçtim.

z

Temel Ingilizce ogretmenine sormus.

Hocam tamam come yaziyoruz kam okuyoruz.

Peki come nin gel oldugunu nasil anliyoruz?

Delphi helphinde birbirine zincirle bagli o kadar bilgi varki. Delphiyi kafaya takmak gerekiyor galiba.

Lazim oldukca isi o an cozecek kodlari arayip ugrasmak yoruyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Lazım oldukça buluyorsunuz , zamanla arşiviniz genişliyor. Zaman içinde Come nin  un Gel oldabileceğini anlıyorsunuz.  Yani zaman ve deneyim.

Delphi için  Marco CANTU'nun kitaplarını öneririm. Adam  bu işin kitabını yazmış diyecem ama , zaten kitaptan bahsediyoruz.  :D
Şaka bir yana , gerçekten Delphi'yi  en iyi anlatan adam olduğunu düşünüyorum.

hasangurlek

Alıntı yapılan: "bunalmis"Temel Ingilizce ogretmenine sormus.

Hocam tamam come yaziyoruz kam okuyoruz.

Peki come nin gel oldugunu nasil anliyoruz?

Delphi helphinde birbirine zincirle bagli o kadar bilgi varki. Delphiyi kafaya takmak gerekiyor galiba.

Lazim oldukca isi o an cozecek kodlari arayip ugrasmak yoruyor.

:)

Hocam Temel hala for ve four niye aynı şekilde okunuyorun cevabını arıyor. Lisanlar arası farklılıklar nedeniyle denizcilik havacılık gibi sektörlerde farklı kavramlar kullanılıyor. Türkçede sağ ve sol çok kolaylıkla yanlış anlaşılabilecek kadar birbirine yakın fakat bir o kadarda önem arzedebilecek iki kelime. Bunun için denizcilikte "gemi sağa yatıyor" demek yerine alabora italyanca olduğu halde "sancak alabora" deniyor. Fakat programlama dillerinde aynı işleri yaptırmak için tamamen ingilizce kelimelerden veya kısaltmalarından oluşmuş komutlar, deklarasyonlar vs. ufak tefek farklılıklar dışında artık her dilde ortak kullanılıyor. Benim en gıcık olduğum şey ise kısaltmalar, çünkü bazı zamanlar ne işe yaradığını bulmak için oldukça fazla vakit kaybettiriyor. Dillerin manuelleri, SDK ve NET dökümanları olmasa inanın kimse oturup tek başına PC programı yazamaz. Program yazarken başka bir pencerede ilgili bir dökümanın açık olması her zaman işe yarıyor.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

OG

Üstadlar, konunuzu dağıtmadan küçük bir soru,

Bizim gibi PC - elektronik/işlemci arabirime ihtiyacı olan, yani PC ile dış dünyayı birleştiren işler için hangi dil (windows tabanlı PC prg için) daha uygundur?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Klein

Alıntı yapılan: "OG"Üstadlar, konunuzu dağıtmadan küçük bir soru,

Bizim gibi PC - elektronik/işlemci arabirime ihtiyacı olan, yani PC ile dış dünyayı birleştiren işler için hangi dil (windows tabanlı PC prg için) daha uygundur?

Ben Delphi kullanıyorum.
Sebebi:
Arabirimi kullanışlı, soru sorduğunda cevap verecek insan sayısı fazla , komponentleri bakkalda bile bulunabiliyor ,  hızlı derliyor ,  doküman bulmakta zorlanmıyorsunuz vs.. vs..

Ama gördüğüm kadarıyla  gençler arasında C Sharp  daha popüler.

z

Ayrintilarla bogusmak istemiyor, kodlar hizli kossun diyorsan kesinlikle Delphi. Picproje delphi kosesinde gordugun gibi sorulara cozum cok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com