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
WWW
Cevapla
#3
(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.
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
(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?
Delphi Can'dır!
WWW
Cevapla
#6
(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
Cevapla
#7
(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ı
WWW
Cevapla
#8
(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;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#9
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.
One of the major software engineering challenges is managing change.
Cevapla
#10
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)
There's no place like 127.0.0.1
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  TThread.Synchronize çalışmama sorunu muratmutlu 3 1.380 10-10-2023, Saat: 12:16
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi