Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314
Üstad
28-02-2017, Saat: 17:15
(Son Düzenleme: 28-02-2017, Saat: 17:40, Düzenleyen: Tuğrul HELVACI.)
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
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314
Üstad
(28-02-2017, Saat: 17:44)yhackup Adlı Kullanıcıdan Alıntı: Nil dediğimizde yakaladığı ilk thread ile mi işlem yapacak 
Dene bakalım

Ç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...
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314
Üstad
28-02-2017, Saat: 18:06
(Son Düzenleme: 28-02-2017, Saat: 18:19, Düzenleyen: Tuğrul HELVACI.)
(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 
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 
Nedir? Öğrenebilir miyiz?
Hemen değil üstad

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...
Yorumları: 117
Konuları: 6
Kayıt Tarihi: 27-08-2016
Rep Puanı: 884
Acemi
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.
Yorumları: 1.572
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.841
Üstad
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