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 1 von 2  1 2      
Gravitar

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

Laden von HTML-Seiten mit Multithread

  Alt 30. Jan 2007, 14:50
Hi,

ich stehe im Moment vor folgendem Problem:

1. Ich habe eine Liste von ca. 100 Web-URL's
2. Diese URL's möchte ich unter Ausnutzung der kompletten DSL-Bandbreite laden und auswerten.

Also dachte ich mir, da könnte man doch mit Multithreading (100 Threads parallel) arbeiten.

Leider verstehe ich nicht, wie ich beim Aufruf eines Threads Parameter mitgeben kann (URL, Index innerhalb der Tabelle).

Hoffe, das Problem ist schon gelöst

Gruß, Andreas
  Mit Zitat antworten Zitat
muRR
(Gast)

n/a Beiträge
 
#2

Re: Laden von HTML-Seiten mit Multithread

  Alt 30. Jan 2007, 15:12
Hallo,
sicherlich gibt es Lösungen dafür. Die Suche hilft da gewiss weiter: Hier im Forum suchenthread AND parameter
Falls du dennoch nicht fündig werden solltest, melde dich doch nochmal.
  Mit Zitat antworten Zitat
Pfoto

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 30. Jan 2007, 15:46
Hallo!

ich kann auch hier die Einführung einer Jobliste mit
einer beliebig festlegbaren Menge an Threads empfehlen.

Denn du willst evtl. nach und nach immer neue URLs
ausgewertet bekommen. Da wäre es unpassend, stets immer
neue Threads für jede weitere URL zu erstellen.
Da bricht dir ja irgendwann das System zusammen.

Lies mal diese Beiträge und schau
dir das Projekt im letzten Beitrag an (ZIP-Datei)

Mach dir am Besten auch schon Gedanken darüber, wie
du die ausgewerteten Daten weiterverarbeiten willst,
denn da fängt die Synchronisation an, damit die Daten
z.B. geordnet in eine Datenbank oder ein File-Record
gelagen.



Gruß
Pfoto
Jürgen Höfs
Jürgen Höfs / picoly.de
  Mit Zitat antworten Zitat
Gravitar

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:27
Hi,

ich habe mich jetzt (dank der Tipps) eingelesen. Allerdings fand ich die beschriebenen Lösungen für mein Problem als zu groß.

Also, frisch ans Werk und das (zumindest geglaubt) Verstandene umgesetzt!

Die Definition eines Threads gelang mir ja noch:

Delphi-Quellcode:
TMyThread = class(TThread) protected
  procedure execute; override;
Danach dann die Aufruffunktion:

Delphi-Quellcode:
for x := 0 to 10 do
   begin
     MyThread := TmyThread.create(True);
     mythread.resume;
     sleep(10);
   end;
Aber hier ging es schon los.
In der Beschreibung steht, dass nach .create die Funktion .execute ausgeführt wird. Wird sie aber nicht! Nur wenn .resume genutzt wird, scheint der .execute-Block ausgeführt zu werden. Warum auch immer (eigentlich ist resume für das Wideraufsetzen nach einem suspend).

Doch danach wird es noch schlimmer (hier der execute-Block):

Delphi-Quellcode:
procedure TMyThread.Execute;
var web : string;
begin
  web := UTF8ToWideString(form1.IdHTTP1.Get(form1.ListView1.Items[x].SubItems.Strings[4]));
  form1.ListView1.Items[x].SubItems.Strings[4] := web;
end;
Die Variable X ist global definiert. Danach soll sich execute also aus einem ListView aus der x-ten Zeile eine URL holen und über idhttp1.get den HTML-Inhalt besorgen.

Mit einem Thread funktioniert das sogar.

Ab 2 Threads gibt es eine Exception: Class EIdSocketError with Message 'Socket Error #10057 Socket is not connected'

Jetzt kann es natürlich sein, dass die idHTTP1.get überhaupt nicht in der Lage ist multithreaded ausgeführt zu werden. Dann kann ich mir natürlich einen Wolf schreiben!

Andererseits wurden in den Dokumenten häufig davon gesprochen, eine Funktion trheadsicher zu machen.

Tja, wenn jetzt jemand Hilfe weiss, ich könnte Hilfe vertragen.

Gruß, Andreas
  Mit Zitat antworten Zitat
Antigo

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:34
Du wirst für jede Webseite die du downloaden möchtest eine eigene Instanz von idHttp erstellen müssen.

Ich hab auch noch nicht oft mit Threads gearbeitet, aber ich meine man müsste Zugriffe auf Objekte und Komponenten ausserhalb des Threads in eine seperate Funktion auslagern und über Synchronize(DeineProzedur); aufrufen. Dazu steht aber meine ich auch einiges in der Delphi Hilfe.
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:36
Deklariere doch für jeden Thread ein eigenes IdHTTP. Wie soll das denn funktionieren, wenn hundert Threads gleichzeitig auf ein IdHTTP zugreifen?
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Pfoto

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:44
Hi!

zu "resume"

der Thread wird ja bereits "supended" kreiert:
MyThread := TmyThread.create(True); Das tust du in diesem Fall mit "True".


So wie du innerhalb deiner Execute-Methode auf
die Form zugreifst, muss es früher oder später knallen.

Zu verhindern, dass mehrere Threads (und evtl. die
Hauptanwendung) im selben Moment auf die VCLs einer Form
oder anderere Ressourcen zugreifen, meint man mit synchronisieren.

Die Werte aus deiner Liste musst du dir also so beschaffen,
dass es nicht zu Kollisionen kommen kann.

Dazu war auch das Beispiel mit der Jobliste gut, auf das
ich weiter oben verlinkt hatte.
Siehe dir dazu das Objekt "TCriticalSection" an.
Es lässt z.B. in den aufgeführten Funktionen jeweils nur
1 Thread den darin enthaltenen Code ausführen -- die anderen
müssen solange draußen bleiben.


Um Daten mit den Komponenten auf deiner Form zu synchronisieren
gibt es für das Thread-Objekt die Methode Synchronize.
Schau dir dazu auch mal das Beispiel im Delphi Demo-Verzeichnis an.

Diese Dinge müsstest du also bei der Implementierung deiner
Threads berücksichtigen. Schau dich doch nochmal im Forum um;
gerade über das Thema Up-Downloads innerhalb eines Threads gibt es
hier schon eine Menge.


Gruß
Pfoto
Jürgen Höfs
Jürgen Höfs / picoly.de
  Mit Zitat antworten Zitat
Gravitar

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:47
Hi igel457,

Zitat:
Deklariere doch für jeden Thread ein eigenes IdHTTP. Wie soll das denn funktionieren, wenn hundert Threads gleichzeitig auf ein IdHTTP zugreifen?
Aha, wie mache ich denn sowas?

Gruß, Andreas
  Mit Zitat antworten Zitat
Pfoto

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 11:50
Zitat von Gravitar:
Hi igel457,

Zitat:
Deklariere doch für jeden Thread ein eigenes IdHTTP. Wie soll das denn funktionieren, wenn hundert Threads gleichzeitig auf ein IdHTTP zugreifen?
Aha, wie mache ich denn sowas?

Gruß, Andreas

Delphi-Quellcode:
TMyThread = class(TThread)
private
  fIdHTTP: TIdHTTP; <-- So!
public
  procedure execute; override;
end;
Edit: Schreibfehler ausgebessert (TIdHTTP)

Sie mir nicht böse wenn ich das sage,
aber beschäftige dich doch zunächst mit den Grundlagen der OOP
bevor du eine Multithreading-Anwendung schreiben willst.

Gruß
Pfoto
Jürgen Höfs
Jürgen Höfs / picoly.de
  Mit Zitat antworten Zitat
marabu

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

Re: Laden von HTML-Seiten mit Multithread

  Alt 4. Feb 2007, 12:10
Hallo,

man beachte den Schreibfehler:

Delphi-Quellcode:
TMyThread = class(TThread)
private
  fIdHTTP: IdHTTP; <-- So!
public
  procedure execute; override;
end;
Der Typ heißt TIdHTTP - er ist in der Unit idHTTP vereinbart.

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:31 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