Delphi Can
TThread.Queue Tehlikesi - 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ığı: TThread.Queue Tehlikesi (/showthread.php?tid=713)

Sayfalar: 1 2


TThread.Queue Tehlikesi - Tuğrul HELVACI - 28-02-2017

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


TThread.Queue Tehlikesi - yhackup - 28-02-2017

Nil dediğimizde yakaladığı ilk thread ile mi işlem yapacak Big Grin


Cvp: TThread.Queue Tehlikesi - Tuğrul HELVACI - 28-02-2017

(28-02-2017, Saat: 17:44)yhackup Adlı Kullanıcıdan Alıntı: Nil dediğimizde yakaladığı ilk thread ile mi işlem yapacak Big Grin

Dene bakalım Wink Çok ciddi bir fark tespit etmeniz lazım.


TThread.Queue Tehlikesi - edo - 28-02-2017

İkisinde de çok ciddi bir sıkıntı var Big Grin


Cvp: TThread.Queue Tehlikesi - DelphiCan - 28-02-2017

(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: İkisinde de çok ciddi bir sıkıntı var Big Grin

Nedir? Öğrenebilir miyiz?


Cvp: TThread.Queue Tehlikesi - edo - 28-02-2017

(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı:
(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: İ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


TThread.Queue Tehlikesi - yhackup - 28-02-2017

(28-02-2017, Saat: 18:00)edo Adlı Kullanıcıdan Alıntı:
(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Nedir? Öğrenebilir miyiz?

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

Bende donmadı


Cvp: TThread.Queue Tehlikesi - Tuğrul HELVACI - 28-02-2017

(28-02-2017, Saat: 18:00)edo Adlı Kullanıcıdan Alıntı:
(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı: Nedir? Öğ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.

Bakınız

(28-02-2017, Saat: 17:57)DelphiCan Adlı Kullanıcıdan Alıntı:
(28-02-2017, Saat: 17:55)edo Adlı Kullanıcıdan Alıntı: İ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;



TThread.Queue Tehlikesi - kimimben - 28-02-2017

Queue 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, RemoveQueuedEvents 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.


TThread.Queue Tehlikesi - SimaWB - 28-02-2017

TThread.Queue'nin ilk parametresi olarak nil değilde bir Thread kullanılırsa, çalıştırılacak procedure bu Thread'in kuyruğuna atılır. Çalıştırılacak procedure henüz işini bitirmeden ilk parametre olarak geçilen Thread sonlanırsa bu da bizim çalıştırmak istediğimiz kodların çalışmadan sonlanması demektir.(Bilmiyorum ama belki daha başka ciddi sorunlara da sebebiyet veriyordur)