Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TThread.Queue Tehlikesi
#1
TThread.Queue(
  TThread.CurrentThread,

  procedure
  begin
    // Kodlarınız...
  end
)

ile

TThread.Queue(
  nil,

  procedure
  begin
    // Kodlarınız...
  end
)

arasındaki farkı ve hangisinde çok ciddi bir tehlike ile karşı karşıya olduğunuzu tespit edip, bunun nedenlerini izah edebilir misiniz ?

Sıkıntıyı , aradaki farkı tespit edebilene +4 puan Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#2
Nil dediğimizde yakaladığı ilk thread ile mi işlem yapacak Big Grin
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#3
(28-02-2017, Saat: 17:44)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlNil dediğimizde yakaladığı ilk thread ile mi işlem yapacak Big Grin

Dene bakalım Wink Çok ciddi bir fark tespit etmeniz lazım.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#4
İkisinde de çok ciddi bir sıkıntı var Big Grin
Cevapla
#5
class procedure TThread.Queue(const AThread: TThread; AMethod: TThreadMethod);
var
 LSynchronize: PSynchronizeRecord;
Buradan yola çıkarak bir şey anlayayım dedim de cık olmadı
begin
 if AThread <> nil then
   AThread.Queue(AMethod)
 else
 begin
   New(LSynchronize);
   try
     LSynchronize.FThread := nil;
     LSynchronize.FSynchronizeException := nil;
     LSynchronize.FMethod := AMethod;
     Synchronize(LSynchronize, True);
   finally
     if MainThreadID = CurrentThread.ThreadID then
       Dispose(LSynchronize);
   end;
 end;
end;
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#6
(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olİkisinde de çok ciddi bir sıkıntı var Big Grin

Nedir? Öğrenebilir miyiz?
WWW
Cevapla
#7
(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olİkisinde de çok ciddi bir sıkıntı var Big Grin

Nedir? Öğrenebilir miyiz?

Uygulama donuyor. Sanki her ikisi de ana thread'i blokluyor  Huh
Cevapla
#8
(28-02-2017, Saat: 18:00)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlNedir? Öğrenebilir miyiz?

Uygulama donuyor. Sanki her ikisi de ana thread'i blokluyor  Huh

Bende donmadı
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#9
(28-02-2017, Saat: 18:00)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlNedir? Öğrenebilir miyiz?

Uygulama donuyor. Sanki her ikisi de ana thread'i blokluyor  Huh

TThread.Queue metodu ana thread içinde çalıştırılmamalıdır.! Çalıştırılır ise muhtemelen sonsuz döngü oluşur. Dolayısı ile verdiğim örnekleri bir başka thread içinden çağırın.


Alıntı:Warning: Do not call Queue from within the main thread. This can cause an infinite loop.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olİkisinde de çok ciddi bir sıkıntı var Big Grin

Nedir? Öğrenebilir miyiz?

Hemen değil üstad Wink Biraz araştırma yapılmalı.

Formunuzun üstüne bir button bir de Memo atın ve aşağıdaki şekillerde test edin. İpucunu vermiş olayım, sonra sonuçları bizimle paylaşın.

procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      iCounter : Integer;
    begin
      for iCounter := 0 to 999 do
        TThread.Queue(
          TThread.CurrentThread,

          procedure
          begin
            Memo1.Lines.Add('test');
            Sleep(10);
          end
          );
    end
  ).Start;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      iCounter : Integer;
    begin
      for iCounter := 0 to 999 do
        TThread.Queue(
          nil,

          procedure
          begin
            Memo1.Lines.Add('test');
            Sleep(10);
          end
          );
    end
  ).Start;
end;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol methodu ile ilgili dokümanda;

AMethod parametresi ile belirtilen procedure Main thread içersinde  asenkron olarak çalıştırılıyormuş.Böylece Multithread çakışmalarını önlüyormuş.

static methodlar için, AMethod parametresini herhangi bir AThread parametresi ile geçtiğimiz thread ile ilişkilendirebilirmişiz.

Bizim bu AThread parametresi ile geçtiğimiz thread bilgisini, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol methodu, kuyruktaki methodu bulabilmek için kullanıyormuş.

Şimdi beynimin kıvrımlarını biraz kullanacak olursam;
AThread parametresini nil/null geçer isek kuyruktan methodu bulamayacak mı ?
Ayrıca sanırım bu asenkron mantığı methodu heap'de allocate ederek yapıyor.
One of the major software engineering challanges is managing change.
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi