AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Laden von HTML-Seiten mit Multithread
Thema durchsuchen
Ansicht
Themen-Optionen

Laden von HTML-Seiten mit Multithread

Ein Thema von Gravitar · begonnen am 30. Jan 2007 · letzter Beitrag vom 9. Feb 2007
Antwort Antwort
Seite 2 von 2     12   
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 13:59
Hi Pfoto,

dein Tipp

Delphi-Quellcode:
TMyThread = class(TThread)
private
  fIdHTTP: IdHTTP; <-- So!
public
  procedure execute; override;
end;
funktioniert nicht. Müsste es nach OOP nicht fIdHTTP : TIdHTTP heissen?

Egal, funktioniert auch nicht, da nach Aufruf in der execute eine Acess-violation in Modul irgendwas auftaucht.

Gruß, Andreas
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#12

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 15:12
Acces Violation.. hört sich so an als hättest du das idHTTP Objekt nicht instanziert.
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 16:24
Hi Antigo,

so, jetzt habe ich auch noch das IdHTTP-Objekt instanziiert.

Der Source sieht jetzt so aus:

Delphi-Quellcode:
TMyThread = class(TThread)
private
  fIdHTTP: TIdHTTP;
public
  procedure execute; override;
end;

...

procedure TMyThread.Execute;
var web : string;
    myidhttp : TIdHTTP;
begin
  myidhttp := tIdHTTP.Create();
  web := UTF8ToWideString(MyIdHTTP.get(form1.ListView1.Items[x].SubItems.Strings[4]));
  form1.ListView1.Items[x].SubItems.Strings[4] := web;
  myidhttp.Free;
end;
Ich gebe ja zu, dass ich mit dieser oop-Materie bisher wenig zu tun hatte, aber wozu habe ich jetzt eigentlich fIdHTTP deklariert?

Das Instanziieren habe ich über TIdHTTP vorgenommen (fidHTTP habe ich auch mal versucht, führt aber sofort zu einem Crash).

Mittlerweile gelingt es mir bis zur 5 Threads zu starten. Komischerweise bekomme ich aber nur 1 Ergebnis zurück (in Zeile 6!

Wenn ich 10 Threads starte, gibts wieder eine Access-Violation!

Das ganze kann doch so schwer nicht sein oder muss man dafür tatsächlich komplett OOP lernen?

Gruß, Andreas
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Laden von HTML-Seiten mit Multithread

  Alt 6. Feb 2007, 08:19
Hi,

mittlerweile klappt das Multithreading mit 6 parallelen Threads ganz gut.

Die Definition von fIdHTTP habe ich einfach weggelassen.

Das ich nur 1 Ergebnis zurückbekam lag offenbar an der globalen Variablen X, die nach Abschluß von idHTTP.get bereits auf 6 hochgezählt war und dann nur dorthin zurücklieferte.

Also habe ich einfach die globale Variable in eine lokale kopiert (schöner wäre es natürlich mit einer Variablenübergabe in Execute, aber ich habe keine Ahnung, wie das geht).

So, nun stellen sich "nur" noch die Frage:

Wieso gibt es eine Access-Violation, wenn mehr als 6 Threads gestartet werden? Windows verkraftet doch eine ganze Menge (>450 Threads bei ruhendem System).

Gruß, Andreas
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Laden von HTML-Seiten mit Multithread

  Alt 6. Feb 2007, 09:48
Vielleicht solltest Du den Zugriff auf VCL Elemente, wie die ListView, synchronisieren.
Ein Beispiel wie das geht findest Du hier -> http://greatis.com/delphicb/tips/lib...nchthread.html

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Laden von HTML-Seiten mit Multithread

  Alt 8. Feb 2007, 18:28
Hi,

Danke für die Tipps. Inzwischen habe ich nahezu alle umgesetzt. Der Source sieht jetzt so aus:

Delphi-Quellcode:
TMyThread = class(TThread)
private
  fIdHTTP: TIdHTTP;
  i : integer;
  web : string;
protected
  procedure GetResult;
  procedure execute; override;
public
end;

...

procedure tmythread.GetResult;
begin
  web := UTF8ToWideString(web);
  form1.ListView1.Items[i].SubItems.strings[4] := web;
end;

procedure TMyThread.Execute;
begin
  i := x;
  fIdHTTP := TIdHTTP.Create(nil);
  web := fIdHTTP.get(form1.ListView1.Items[i].SubItems.Strings[4]);
  Synchronize(GetResult);
end;
X und Web sind global definiert und dienen zur Übergabe.

Bei mehr als 10 Threads parallel kommt jetzt die Fehlermeldung "Socket Error #10060 Connection timed out".

Das hört sich jetzt nicht mehr nach einer Access-Violation an.

Weiss jemand Rat?

Gruß, Andreas
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Laden von HTML-Seiten mit Multithread

  Alt 8. Feb 2007, 18:39
Hi!

vielleicht ist die Wartezeit eines Threads beim
Zugreifen auf eine Seite nun einfach überschritten,
weil er aufgrund der hohen Auslastung nicht
zum Zuge kommt.


Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Laden von HTML-Seiten mit Multithread

  Alt 8. Feb 2007, 23:19
Hi,

so, dass Problem ist gelöst! Über 60 parallele HTTP.Get's werden ohne Fehler ausgeführt.

Erstaunlicherweise funktioniert der schon gezeigte Source ohne jede Änderung, wenn man nur in der Aufrufschleife ein "Application.Processmessages" einfügt! (habe ich eigentlich nur gemacht, um die Aktualisierung des ListView hinzubekommen.

Hier nun die komplette Lösung (für diejenigen, die ähnliche Probleme lösen müssen):


Delphi-Quellcode:
{Definition}
TMyThread = class(TThread)
private
  fIdHTTP: TIdHTTP;
  i : integer;
  web : string;
protected
  procedure GetResult;
  procedure execute; override;
public
end;

{Ergebniss des Threads auswerten}
procedure tmythread.GetResult;
begin
  web := UTF8ToWideString(web);
  form1.ListView1.Items[i].SubItems.strings[4] := web;
  fidHTTP.free;
end;

{Thread ausführen}
procedure TMyThread.Execute;
begin
  i := x;
  fIdHTTP := TIdHTTP.Create(nil);
  web := fIdHTTP.get(form1.ListView1.Items[i].SubItems.Strings[4]);
  Synchronize(GetResult);
end;

{Je Zeile innerhalb der Listview wird ein Thread gestartet}
for x := 0 to listview1.Items.count-1 do
begin
  inc(threadcount);
  MyThread := TmyThread.create(true);
  MyThread.freeonterminate := true;
  mythread.Resume;
  sleep(10);
  application.ProcessMessages;
end;
Das wars auch schon.

Man beachte die application.processmessages in der Aufrufschleife. Wenn diese weggelassen wird, kommt es wieder zu den genannten Fehlern (..Time out...).

Wer kann erklären, warum das so ist?

Viele Grüße und nochmals Danke für die Hilfe

Andreas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#19

Re: Laden von HTML-Seiten mit Multithread

  Alt 9. Feb 2007, 09:24
Hallo Andreas,

Zitat von Gravitar:
... Man beachte die application.processmessages in der Aufrufschleife. Wenn diese weggelassen wird, kommt es wieder zu den genannten Fehlern (..Time out...). Wer kann erklären, warum das so ist? ...
durch die Verwendung von Synchronize() wartet das Programm auf den Eintritt des VCL MainThread in die Idle-Routine. Ohne Application.ProcessMessages() passiert das frühestens nach dem Verlassen deiner Schleife.

Deine Klasse TMyThread könnte ich mir auch ohne die feste Kopplung an die Benutzerschnittstelle vorstellen. Der Code im Anhang ist allerdings nicht getestet.

Grüße vom marabu
Angehängte Dateien
Dateityp: pas demothread_366.pas (1,2 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: Laden von HTML-Seiten mit Multithread

  Alt 9. Feb 2007, 11:40
Hallo Marabu,

Zitat von marabu:
durch die Verwendung von Synchronize() wartet das Programm auf den Eintritt des VCL MainThread in die Idle-Routine. Ohne Application.ProcessMessages() passiert das frühestens nach dem Verlassen deiner Schleife.
Aha, aber warum wird dann der Fehler zurückgemeldet? Nach Verlassen der Schleife wäre das doch auch o.k.

Zitat von marabu:
Deine Klasse TMyThread könnte ich mir auch ohne die feste Kopplung an die Benutzerschnittstelle vorstellen. Der Code im Anhang ist allerdings nicht getestet.
Oh, fein. Ich schau mir das mal an und probiere es heute Abend aus. Danke für den Source (das Thema constructor scheint eine Antwort auf meinen ersten Eintrag zu sein (Parameterübergabe)

Gruß, Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz