Yorumları: 46
Konuları: 13
Kayıt Tarihi: 04-11-2019
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.2
- Delphi 10.1
- Delphi XE7
Rep Puanı: 98 Başlangıç
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;
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
İ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...
Yorumları: 884
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.853 Uzman
@ 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
Yorumları: 46
Konuları: 13
Kayıt Tarihi: 04-11-2019
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.2
- Delphi 10.1
- Delphi XE7
Rep Puanı: 98 Başlangıç
21-11-2019, Saat: 10:45
(Son Düzenleme: 21-11-2019, Saat: 10:49, Düzenleyen: BGNew.)
(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.
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
(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...
Yorumları: 884
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.853 Uzman
(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;
Yorumları: 46
Konuları: 13
Kayıt Tarihi: 04-11-2019
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.2
- Delphi 10.1
- Delphi XE7
Rep Puanı: 98 Başlangıç
@ 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;
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
(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.

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