![]() |
|
Tread içinde iç, içe döngü - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Mobil Platform - FireMonkey (FMX) (https://www.delphican.com/forumdisplay.php?fid=7) +--- Konu Başlığı: Tread içinde iç, içe döngü (/showthread.php?tid=4194) |
Tread içinde iç, içe döngü - BGNew - 21-11-2019 Merhaba; Başarabilirsem ufak bir uygulama var. Uygulama ajansların xml sayfalarından verileri çekip veritabanı'na kaydetmek. Fakat Tread'ti bir türlü çözemedim. Veritabanı na eklemiş olduğum XML adreslerini tek, tek alıp, daha önce kayıt yapılmamışsa farklı bir veritabanı na kaydetmek istiyorum. test yaptığımda ya program kilitleniyor yada adres hatası alıyorum (url hatası değil). Acaba bu durumu nasıl çözebilirim? procedure TForm1.Button1Click(Sender: TObject);
var
Tread: TThread;
begin
Tread := TThread.CreateAnonymousThread(
procedure
var
FDQ: TFDQuery;
XMLNode: IXMLNode;
sTitle, sLink: WideString;
AjansUrl, AjansName: WideString;
begin
CoInitialize(Nil);
FDQ := TFDQuery.Create(Nil);
try
TThread.Synchronize(TThread.CurrentThread,
procedure()
begin
FDQ.Connection := FDConnection; // databaseden xml aldık
FDQ.Active := False;
FDQ.Close;
FDQ.SQL.Clear;
FDQ.SQL.Add('Select * From XML');
FDQ.Prepared := True;
FDQ.Open;
while Not FDQ.Eof do
begin
AjansUrl := FDQ.FieldByName('URL').AsString;
AjansName := FDQ.FieldByName('AJANS').AsString;
Form1.XMLDocument.LoadFromFile(AjansUrl);
Form1.XMLDocument.Active := True;
XMLNode := Form1.XMLDocument.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
FDQ.Next;
end;
while XMLNode <> Nil do
begin
sTitle := Copy(XMLNode.ChildNodes['Title'].Text, 1, 255);
sLink := Copy(XMLNode.ChildNodes['Link'].Text, 1, 255);
XMLNode := XMLNode.NextSibling;
end;
end);
finally
XMLDocument.Active := False;
FDQ.Free;
CoUninitialize();
end;
end);
Tread.Start;
end;
Tread içinde iç, içe döngü - Tuğrul HELVACI - 21-11-2019 İnatla ve ısrarla thread'leri hatalı kullanıyorsunuz ve öğrenmemek için ekstra çaba sarfediyorsunuz. Sadece kendinize değil, sizin yazdığınız kodları kopyalayıp, yapıştıracak kişilere de zararınız olacak. Ya biraz araştırın ve öğrenin ya da Thread kullanmaktan vazgeçin bana kalırsa. Bu size aynı konuda yaptığım üçüncü uyarı. Tread içinde iç, içe döngü - esistem - 21-11-2019 @BGNew aşağıdaki linki okursanız @Tuğrul HELVACI nın ne demek istediğini anlarsınız. http://www.tugrulhelvaci.com/?p=126 Cvp: Tread içinde iç, içe döngü - BGNew - 21-11-2019 (21-11-2019, Saat: 09:08)esistem Adlı Kullanıcıdan Alıntı: @BGNew aşağıdaki linki okursanız @Tuğrul HELVACI nın ne demek istediğini anlarsınız. Merhaba @Tuğrul HELVACI nın bir çok Tread ilgili makaleyi okudum; yanlış anlaşılıp da polemiğe girmek istemiyorum. Ama hocamız web sayfasında ki başlık ilginç değil mi? Nedir bu Thread’lerden çektiğimiz..! . Yapabilseydim zaten yadım istemezdim. Cvp: Tread içinde iç, içe döngü - Tuğrul HELVACI - 21-11-2019 (21-11-2019, Saat: 10:45)BGNew Adlı Kullanıcıdan Alıntı:(21-11-2019, Saat: 09:08)esistem Adlı Kullanıcıdan Alıntı: @BGNew aşağıdaki linki okursanız @Tuğrul HELVACI nın ne demek istediğini anlarsınız. Güzel kardeşim, gerçekten okuduğuna emin misin ? Eğer okusa idin; tüm işi TThread.Synchronize ile sarmalamazdın. Bu durumda thread kullanmanın hiç bir anlamı kalmıyor. Madem okudun, bu durumda lütfen daha dikkatli oku; gerçekten anlamadığın hususları sor, yardımcı olmaya gayret edelim. Cvp: Tread içinde iç, içe döngü - esistem - 21-11-2019 (21-11-2019, Saat: 10:45)BGNew Adlı Kullanıcıdan Alıntı:(21-11-2019, Saat: 09:08)esistem Adlı Kullanıcıdan Alıntı: @BGNew aşağıdaki linki okursanız @Tuğrul HELVACI nın ne demek istediğini anlarsınız. Yani kısaca sizin yazdığınız ile aşağıdaki kod arasında hiçbir fark yok demek istiyor, önce aşağıdaki şekilde çözün olayı sonra bir thread yazıp kodu bitirirsiniz. procedure TForm1.Button1Click(Sender: TObject);
var
FDQ: TFDQuery;
XMLNode: IXMLNode;
sTitle, sLink: WideString;
AjansUrl, AjansName: WideString;
begin
FDQ := TFDQuery.Create(Nil);
try
FDQ.Connection := FDConnection; // databaseden xml aldık
FDQ.Active := False;
FDQ.Close;
FDQ.SQL.Clear;
FDQ.SQL.Add('Select * From XML');
FDQ.Prepared := True;
FDQ.Open;
while Not FDQ.Eof do
begin
AjansUrl := FDQ.FieldByName('URL').AsString;
AjansName := FDQ.FieldByName('AJANS').AsString;
Form1.XMLDocument.LoadFromFile(AjansUrl);
Form1.XMLDocument.Active := True;
XMLNode := Form1.XMLDocument.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
FDQ.Next;
end;
while XMLNode <> Nil do
begin
sTitle := Copy(XMLNode.ChildNodes['Title'].Text, 1, 255);
sLink := Copy(XMLNode.ChildNodes['Link'].Text, 1, 255);
XMLNode := XMLNode.NextSibling;
end;
finally
XMLDocument.Active := False;
FDQ.Free;
end;
end;
Cvp: Tread içinde iç, içe döngü - BGNew - 21-11-2019 @Tuğrul HELVACI Thread ilgili kişisel yazınızı defalarca okudum. Hatta paylaşmış olduğunuz örnek kod üzerinden kodlarımda değişiklik yapıyorum. Fakat aşağıdaki resimdeki hatayı alıyorum. dediğiniz gibi (gerçekten anlamadığın hususları sor, yardımcı olmaya gayret edelim.) yardımlarınızı bekliyorum. ![]() Örnek kodunuz: procedure TMyThread.Execute; begin inherited; try CoInitialize(nil); try // Database'e bağlan birşeyler yap.. // yada başka bir COM nesnesi ile çalış. finally end; except on E: Exception do begin end; end; Kendi kodlarım:
procedure TwendenAl.Execute;
var
FDQ: TFDQuery;
XMLNode: IXMLNode;
sTitle, sLink: WideString;
AjansUrl, AjansName: WideString;
begin
inherited;
try
CoInitialize(Nil);
FDQ := TFDQuery.Create(Nil);
Form1.FDGUIxWaitCursor.ScreenCursor := gcrNone;
try
FDQ.Connection := Form1.FDConnection; // databaseden xml aldık
FDQ.Active := False;
FDQ.Close;
FDQ.SQL.Clear;
FDQ.SQL.Add('Select * From XML');
FDQ.Prepared := True;
FDQ.Open;
while Not FDQ.Eof do
begin
AjansUrl := FDQ.FieldByName('URL').AsString;
AjansName := FDQ.FieldByName('AJANS').AsString;
if IsValidURL(Nil, PWideChar(AjansUrl), 0) <> S_FALSE then // Web sayfası kontrol
begin
Form1.XMLDocument.Active := False;
Form1.XMLDocument.LoadFromFile(AjansUrl);
Form1.XMLDocument.Active := True;
XMLNode := Form1.XMLDocument.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
FDQ.Next;
while XMLNode <> Nil do
begin
sTitle := Copy(XMLNode.ChildNodes['title'].Text, 1, 255);
sLink := Copy(XMLNode.ChildNodes['link'].Text, 1, 255);
XMLNode := XMLNode.NextSibling;
end;
end;
end;
finally
Form1.XMLDocument.Active := False;
Form1.FDGUIxWaitCursor.ScreenCursor := gcrNone;
FDQ.Free;
CoUnInitialize;
end;
except
on E: Exception do
begin
end;
end;
end;
Cvp: Tread içinde iç, içe döngü - Tuğrul HELVACI - 22-11-2019 (21-11-2019, Saat: 18:22)BGNew Adlı Kullanıcıdan Alıntı: @Tuğrul HELVACI Thread ilgili kişisel yazınızı defalarca okudum. Merhaba, öncelikle belirteyim; benim thread'ler ile ilgili sadece bir tane makalem yok. Epeyce var. Ayrıca, gerek bu sitede gerek diğer kardeş sitemizde bu hususlarda yazılan onlarca cevap var. Elbette araştırmak isteyen için her şey ortada. Buyrun bir de bu makaleleri okuyun. Gelgelelim paylaştığınız hata mesajına. O bir AV hatası ve çok genel bir hata. Ayrıca hangi kod satırında ne yaparken oluştuğuna dair bir şey de belirtmemişsiniz. Benim; "anlamadığın hususları sor yardımcı olalım" sözümü oldukça yanlış anlamışsınız. Sadece öğrenmek isteyene sonuna kadar kapımız açık. Multi Threaded programlama; bir thread create edeyim, içine kod yazayım ondan sonra da çalıştırayım değildir.! İşin en önemli ve en zor kısmı senkronizasyondur. Sen de güzel kardeşim, bu hususlara hiç dikkat etmemişsin kodunda. Örneğin kodunda, Form1 üzerindeki bir connection nesnesini thread içinden kullanıyorsun. O halde bir soru sorayım sana: "Bir t zamanında; ya thread içindeki kod o connection üzerinden select sorgusu çalıştırmak isterken; ana formun üzerinden yine aynı connection üzerinden bir şeyler insert etmeye çalışırsan ne olur ?" Tüm bu kelamlar, öğrenmek isteyenler için; maksat eleştirmek değil elbette. |