![]() |
|
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
TThread.Queue Tehlikesi - yhackup - 28-02-2017 Nil dediğimizde yakaladığı ilk thread ile mi işlem yapacak
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 Dene bakalım Çok ciddi bir fark tespit etmeniz lazım.
TThread.Queue Tehlikesi - edo - 28-02-2017 İkisinde de çok ciddi bir sıkıntı var
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 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 Uygulama donuyor. Sanki her ikisi de ana thread'i blokluyor
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? 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? 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 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;
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) |