Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan)
#4
Tutamadım kendimi, servise binmedim Big Grin

1. uygulama:

const
  WM_P2       = WM_User + 11863;

  cSecond     = 30;
  cSleepTime  = cSecond * 1000;

type
  Tp1Frm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private    procedure WM_P2_Message(var msg: TMessage); message WM_P2;
  public
  end;

procedure Tp1Frm1.WM_P2_Message(var msg: TMessage);
begin
  ShowMessage('WM_P2_Message mesajı işleniyor');

  // some code..

  ShowMessage('WM_P2_Message mesajı işlendi');
end;

procedure Tp1Frm1.Button1Click(Sender: TObject);
begin
  Sleep(cSleepTime);
end;


Bu da 2. uygulama:

const
  WM_P2       = WM_User + 11863;

procedure TForm2.Button1Click(Sender: TObject);
var
  p1Handle: HWND;
begin
  p1Handle := FindWindow('Tp1Frm1', nil);

  if p1Handle <> 0 then
    if IsWindow(p1Handle) then
      PostMessage(p1Handle, WM_P2, 0, 0);
      //SendMessage(p1Handle, WM_P2, 0, 0);

  ShowMessage('DONE');
end;


Şimdi gelelim açıklamalara:

Senkron ve asenkron kavramlarını hemen hepimiz biliyoruz değil mi? ( Aslında bu cümleden sonra devam etmeme gerek olmamalı Smile) )

API'leri bilmiyorsak hemen dökümana başvuruyoruz; kaçamazsınız...

PostMessage
SendMessage

PostMessage der ki, HWND parametresi ile verdiğin pencerenin mesaj kuyruğuna, verdiğin mesajı, verdiğin parametrelerle BIRAKIRIM, MESAJIN İŞLENİP İŞLENMEDİĞİYLE İLGİLENMEM, GERİ DÖNERİM.

SendMessage da der ki, HWND parametresi ile verdiğin pencerenin mesaj kuyruğuna, verdiğin mesajı, verdiğin parametrelerle GÖNDERİRİM VE MESAJIN İŞLENMESİNİ BEKLERİM.

Neler olduğu ve neden olduğu tamemen bu bekleme/beklememe mekanizmasının çeşitli kombinasyonları. Şöyle örneklendireyim:

Sleep(30*1000) gibi bir uyuma verdiğinizde ilgili thread bloklanacak olduğu için, varsa, o thread'in mesaj kuyruğu da işlenemeyecektir.

Bu mesaj kuyruğuna SendMessage ile gönderilen tüm mesajlar, thread bloklandığı için işlenemeyecek; gönderici tarafı da alıcıdan bir işlendi cevabı beklediği ve alamadığı için SendMessage içinde bloklanacaklardır.

Bu mesaj kuyruğuna PostMessage ile gönderilen tüm mesajlar, thread bloklandığı için işlenemeyecek FAKAT, gönderici tarafı herhangi bir işlendi cevabı beklemediği için bloklanmayacak ve çalışmasına devam edecektir.

Her iki durum için de, Sleep süresi bitip ilgili thread tekrar tarifelendiğinde alıcı taraftaki kuyruk tüketilmeye devam edilecek ve kuyruktaki mesajlar işlenecektir.

Nasıl aşılabileceğine dair bilgiyi çoktan verdim aslında Smile)

(06-09-2017, Saat: 17:25)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:
(06-09-2017, Saat: 16:46)The_aLiEn Adlı Kullanıcıdan Alıntı: Button ne kadar büyükse proje de o kadar büyük olacak mı peki? Big Grin

Big Grin Tabii

Abi buyur o zaman Smile)

   

--

   
Me on the move..
WWW
Cevapla


Bu Konudaki Yorumlar
Cvp: Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) - Yazar: The_aLiEn - 06-09-2017, Saat: 17:34

Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Soru : Interface mi, Abstract Class mı? uparlayan 3 4.995 24-08-2023, Saat: 20:15
Son Yorum: veteran
  [+10 Puan] String Manipülasyon İşlemleri Abdullah ILGAZ 16 15.809 20-04-2019, Saat: 00:48
Son Yorum: onurcan1977
  Dosya Bulma (Algoritmik Soru Serisi) yhackup 28 27.102 14-11-2018, Saat: 10:07
Son Yorum: engerex
  Tek dizi içinde öncelik sırası belirleme (+10 puan) Abdullah ILGAZ 4 6.080 29-11-2017, Saat: 12:07
Son Yorum: SimaWB
  Bir Record'un içini doldurma (+20 puan) Tuğrul HELVACI 21 23.407 05-10-2017, Saat: 16:33
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi