Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Tread içinde iç, içe döngü
#1
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;
Cevapla
#2
İ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ı.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
@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
WWW
Cevapla
#4
(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.
http://www.tugrulhelvaci.com/?p=126


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.
Cevapla
#5
(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.
http://www.tugrulhelvaci.com/?p=126


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.

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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
(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.
http://www.tugrulhelvaci.com/?p=126


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.

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;
WWW
Cevapla
#7
@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.



JVbDZW.png

Ö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;
Cevapla
#8
(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. 

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.



JVbDZW.png

Ö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;

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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  FMX Android, Uygulama İçinde Playstore sayfasını açtırma. hayalyilmaz43 2 1.973 12-12-2020, Saat: 20:24
Son Yorum: hayalyilmaz43
  Apache modül içinde tcp socket server (indy) kullanabilir miyim? 3ddark 1 2.188 29-01-2020, Saat: 19:07
Son Yorum: Fesih ARSLAN
  Banner reklamı uygulama içinde açma ? Mr.Developer 2 2.710 17-10-2019, Saat: 23:36
Son Yorum: Mr.Developer



Konuyu Okuyanlar: