![]() |
|
100 puan değerinde (Threading) - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: 100 puan değerinde (Threading) (/showthread.php?tid=2182) |
Cvp: 100 puan değerinde (Threading) - Halil Han BADEM - 03-05-2018 @Bahadir.Alkac üstat cevap için çok teşekkürler ve ayrıca ders niteliğinde ki sorunuz için ayrıca @Tuğrul HELVACI üstadıma da teşekkürlerimi sunuyorum. Bu genç yaşımda hemen hemen kimsenin pek fazla dikkat etmediği birşeyi öğrendim. NOT: Hocam sitenizde sanırsam SEO hatası var aramalarda problem yaşıyorum şahsen. Google list üzerinden gözükmüyor(Tuğrul Helvacı yazdığımda çıkıyorda misal dün google veritabanında MsgWaitFor... ile geçen tüm kelimeleri araştırdım ama sizin makaleyi bulamadım.) ![]() Saygılarımla. Cvp: 100 puan değerinde (Threading) - DelphiCan - 03-05-2018 (03-05-2018, Saat: 01:14)hyperxman Adlı Kullanıcıdan Alıntı: @Bahadir.Alkac üstat cevap için çok teşekkürler ve ayrıca ders niteliğinde ki sorunuz için ayrıca @Tuğrul HELVACI üstadıma da teşekkürlerimi sunuyorum. Bu genç yaşımda hemen hemen kimsenin pek fazla dikkat etmediği birşeyi öğrendim. Merhaba, SEO hatası olduğunu sanmıyorum. ![]() Sanırım bu fonksiyonun (arama sözcüğünün) popüler olmasından kaynaklı bir durum. Aynı tarihte açılan farklı bir konumuz (Curl - Sendinblue Mail Gönderme) Google aramalarında ilk sırada (İlk iki sıra dikkat ederseniz Reklam olarak gösteriliyor) çıkıyor. ![]() Hatta bir sık kullanılan Türkçe, 2 yabancı global terimde (.pas ve form .fmx) bile indeximiz çok iyi görünüyor.
100 puan değerinde (Threading) - esistem - 03-05-2018 Benim 3 gündür aradıklarım arasında Tuğrul hocanın sitesine en az 10 kez girmişliğim, derinlemesine threading yazısını en az 3 kez tamamını okumuşluğum var. Onlarca denemede takıldığım tek olay "application.processmessages" bunu kullanmadan yazılabilir şeklinde düşündüğüm için 3 gündür arıyorum, gerçi dün bir makalede okumuştum olmadan olmuyor diye ama napalım böyle öğrenicekmişiz. Cvp: 100 puan değerinde (Threading) - Halil Han BADEM - 03-05-2018 (03-05-2018, Saat: 08:15)DelphiCan Adlı Kullanıcıdan Alıntı:(03-05-2018, Saat: 01:14)hyperxman Adlı Kullanıcıdan Alıntı: @Bahadir.Alkac üstat cevap için çok teşekkürler ve ayrıca ders niteliğinde ki sorunuz için ayrıca @Tuğrul HELVACI üstadıma da teşekkürlerimi sunuyorum. Bu genç yaşımda hemen hemen kimsenin pek fazla dikkat etmediği birşeyi öğrendim. Üstat ben Tuğrul hocanın sitesinden bahsediyorum. DelphiCan''a sıkıntı yok ya
Cvp: 100 puan değerinde (Threading) - DelphiCan - 03-05-2018 (03-05-2018, Saat: 09:31)hyperxman Adlı Kullanıcıdan Alıntı:(03-05-2018, Saat: 08:15)DelphiCan Adlı Kullanıcıdan Alıntı: Merhaba, Pardon. Cvp: 100 puan değerinde (Threading) - Tuğrul HELVACI - 03-05-2018 (02-05-2018, Saat: 23:32)Bahadir.Alkac Adlı Kullanıcıdan Alıntı:(02-05-2018, Saat: 22:20)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: İyi akşamlar. Öncelikle kıymetli bilgilerinizi paylaştığınız için teşekkür ederim. Belirtmek isterim ki, ben bir çözüm aramıyorum. Amacım, önemli gördüğüm bu husus hakkında bir bilinç oluşmasını sağlamaya çalışmaktı. İyi günler, @Bahadir.Alkac bey cevabınıza teşekkür ederim. Üstadım elmalar ile armutları mukayese etmişsiniz. Application.ProcessMessages'in event'ler ile nasıl bir bağlantısı var anlamlandıramadım. Android işletim sisteminin event-driven yapısından bahsetmişsiniz ve eğer yanlış anlamadı isem bu yapı sayesinde GUI'nin ayrı bir thread'de çalıştığını söylemişsiniz. İyi ama Windows'da da GUI ayrı bir thread'de çalışıyor zaten ! Bu thread'e main thread diyoruz. Sanırım bazı kavram karmaşaları yaşıyorsunuz. Windows işletim sisteminde her şey pencereler arası mesajlaşmadan ibarettir. Bu nedenle yapılan hemen hemen her iş bir mesaj ile temsil edilir. Bu mesajlar (WM_PAINT, WM_TIMER, WM_LBUTTONDOWN vb..) işletim sistemi tarafından uygulamanın ana thread'inin mesaj kuyruğuna bırakılır. Ve uygulamanın ana thread'i de mesajları sırası ile alır ve işler. Bu mesaj döngüsü olmadan Windows işletim sisteminde görsel bir uygulama yazılamaz. Hatta servis uygulamasının bile görsel uygulamalara benzeyen bir döngüsü vardır. Şimdi kısaca sizleri biraz derinlere indireyim. Bu sıcak havada serinlik iyi gelecektir eminim. Tüm arkadaşlarım, Delphi'de create ettikleri bir projenin kaynak kodlarına gitsinler. Şuna benzer bir şey ile karşılaşacaklar: program pDevExControlsDemo;
uses
{$IFDEF EurekaLog}
EMemLeaks,
EResLeaks,
EDialogWinAPIMSClassic,
EDialogWinAPIEurekaLogDetailed,
EDialogWinAPIStepsToReproduce,
EDebugExports,
EDebugJCL,
EFixSafeCallException,
EMapWin32,
EAppVCL,
ExceptionLog7,
{$ENDIF EurekaLog}
Vcl.Forms,
uDevExControlsDemo in 'uDevExControlsDemo.pas' {Form1},
uFindAndReplaceEx in 'uFindAndReplaceEx.pas' {frmFindAndReplaceEx},
uTaskDialog in 'uTaskDialog.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Peki daha önce hiç merak ettiniz mi (Bahadır bey size değil genele hitap ediyorum); Application.Run satırından sonra program neden sonlanmıyor ? Programlar yukarıdan aşağıya doğru çalışmazmıydı ? Öyle ise neden uygulama hemen sonlanmıyor ? Bunun cevabı için Application.Run'ın içine bir gidelim: procedure TApplication.Run;
begin
FRunning := True;
try
{$IF NOT DEFINED(CLR)}
AddExitProc(DoneApplication);
{$ENDIF}
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE:
begin
FInitialMainFormState := wsMinimized;
FMainForm.FWindowState := wsMinimized;
end;
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
end;
if FShowMainForm then
if (FMainForm.FWindowState = wsMinimized) or (FInitialMainFormState = wsMinimized) then
begin
Minimize;
if (FInitialMainFormState = wsMinimized) then
FMainForm.Show;
end else
FMainForm.Visible := True;
// BU DÖNGÜYE DİKKAT !!!!
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;
Dikkat ettiniz mi, bir döngü var Şimdi de uygulama sonlanana kadar (Terminated) sürekli çağrılan HandleMessage metoduna bakalım o ne imiş ?procedure TApplication.HandleMessage; var Msg: TMsg; begin if not ProcessMessage(Msg) then Idle(Msg); end; Peki ProcessMessage ne imiş ? Bir de ona bakalım: function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
Unicode: Boolean;
MsgExists: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
begin
Unicode := (Msg.hwnd = 0) or IsWindowUnicode(Msg.hwnd);
if Unicode then
MsgExists := PeekMessageW(Msg, 0, 0, 0, PM_REMOVE)
else
MsgExists := PeekMessageA(Msg, 0, 0, 0, PM_REMOVE);
if MsgExists then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsPreProcessMessage(Msg) and not IsHintMsg(Msg) and
not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
if Unicode then
DispatchMessageW(Msg)
else
DispatchMessageA(Msg);
end;
end
else
begin
{$IF DEFINED(CLR)}
if Assigned(FOnShutDown) then FOnShutDown(self);
DoneApplication;
{$ENDIF}
FTerminate := True;
end;
end;
end;
end;
Görüldüğü gibi, uygulama kuyruğunda bir mesaj var ise (PeekMessage ile bakıldı ama son parametreye dikkat: mesajı silme !) bu durumda mesaj işleniyor. Aşağılarda TranslateMessage ve DispatchMessage API çağrımlarını görebilirsiniz. Buradan da anlaşılabileceği üzere, mesaj döngüsü olmayan bir uygulama(GUI) çalışamıyor! bile. Evet gördüğünüz gibi Delphi herzamanki hüneri ile çok ince detayları kullanıcılarından gizleyebilmiş. Ama bizler Delphi değil de C/C++ programcısı olsaydık, ya da TForm sınıfı yerine kendi penceremizi oluşturmak durumunda kalsaydık; o durumda PeekMessage, GetMessage, TranslateMessage, DispatchMessage API'leri ile fazlası ile haşır neşir olacaktık. Kısacası sizin dediğiniz gibi Application.ProcessMessages "ana thread'e yanlış bir sorumluluk yüklemekten kaynaklanan bir kaçış metodu" değil.! O sistemin olmazsa olmazına bir referans yapıyor sadece. Ana thread'iniz işletim sistemine 5 sn. boyunca yanıt vermez ise; işletim sistemi uygulamanızı "Not Responding" konumuna alır. Buna Ghosting de diyorlar, pencereniz Ghost Window (Hayalet) olur. İşte bu olmasın diye, bazen programcılar; ana thread'in mesaj kuyruğuna gelen mesajları da işlemeye izin veren Application.ProcessMessages metodunu çağırırlar. Bu; işi başından aşkın bir vezne memurunun, veznenin önünde biriken evrakların üstünden bir kısmını alıp masaya koymasına, dolayısı ile evrakların devrilmesine mani olmasına benzetilebilir. Evraklar devrilir ise, vezne memuru yerinden kalkmak ve evrakları toplamak zorunda kalır. Böyle bir durumda üzerinde çalıştığı işin de durması gerekir. Tabii başka örnekleri sizler tahayül edebilirsiniz. Şu cümlenizi ise hiç anlayamadım: "Event-driven programcılıkta, ana thread bir işlem yapılacağı zaman, ilgili thread'i çalıştırıyor ve kendi iç parametrelerini buna göre güncelliyor. İlgili threadden mesaj geldiği zaman (illa mesaj değil, aslında bir event tetiklendiği zaman) gerekli işlemleri yapıyor." Event kısaca bir metod pointer'dır. Metod pointer ise bir kod bloğunun hafızadaki başlangıcını gösteren bir işaretçi(pointer) dan başka bir şey değildir. Metod pointer'ın çağrılması CPU'nun ilgili pointer adresinden itibaren kodu işletmesinden başka bir şey değildir. Kısacası event'lerin thread kavramı ile bir ilgisi yoktur. Saygı ve sevgilerim ile... Cvp: 100 puan değerinde (Threading) - Tuğrul HELVACI - 03-05-2018 (03-05-2018, Saat: 01:14)hyperxman Adlı Kullanıcıdan Alıntı: @Bahadir.Alkac üstat cevap için çok teşekkürler ve ayrıca ders niteliğinde ki sorunuz için ayrıca @Tuğrul HELVACI üstadıma da teşekkürlerimi sunuyorum. Bu genç yaşımda hemen hemen kimsenin pek fazla dikkat etmediği birşeyi öğrendim. Ne gibi bir SEO hatası ? Zaten ben sitemde MsgWaitForMultipleObjects/Ex ile ilgili bir şey yazdığımı hatırlamıyorum. Belki bu nedenle bulamamış olabilirsiniz Bu arada merak ettim: "ders niteliğinde ki sorunuz" hangisi ? 100 puan değerinde (Threading) - canbir - 03-05-2018 (03-05-2018, Saat: 14:17)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:(03-05-2018, Saat: 01:14)hyperxman Adlı Kullanıcıdan Alıntı: @Bahadir.Alkac üstat cevap için çok teşekkürler ve ayrıca ders niteliğinde ki sorunuz için ayrıca @Tuğrul HELVACI üstadıma da teşekkürlerimi sunuyorum. Bu genç yaşımda hemen hemen kimsenin pek fazla dikkat etmediği birşeyi öğrendim. Bu konunun ilk mesajındaki 100 puan değerindeki threading sorusu olabilir mi
Cvp: 100 puan değerinde (Threading) - Halil Han BADEM - 03-05-2018 (02-05-2018, Saat: 10:55)edo Adlı Kullanıcıdan Alıntı: Ayrıca WaitForMultipleObjects metodu için şu linkte bilgi var, sanırım yazarı tanıyoruz bir yerlerden @Tuğrul HELVACI hocam bu yoruma ithafen yazdim. O kadar araştırdım cikmadiysa hata vardır diye tahmin ettim. Ders niteliğinde ki soruya gelince WaitForMultipleObjects yapısı için sorduğunuz soru yani bu soru ![]() @canbir Tuğrul hocanın sitesinden bahsediyorum...
100 puan değerinde (Threading) - esistem - 04-05-2018 Onu bunu bilmem, benim müthiş işime yaradı bu konu. Soran ve cevap veren herkese tekrar tekrar teşekkürler. |