Delphi: TWebBrowser im hintergrund-thread
Ist es möglich, laden Sie eine Webseite in einem TWebBrowser in einem hintergrund-thread?
Wenn die Anwendung geladen wird, möchte ich zum download eine Seite aus dem Internet in einen TWebBrowser, aber ich will nicht das blockieren der gui-thread.
Irgendwelche Vorschläge?
Einige Klarstellungen:
Die webbrowser-Komponente ist an ein Leben auf einem Formular, und ich will eine Seite anzeigen aus dem web. Aber ich will alles tun, was den Download von dieser Seite in einem hintergrund-thread, so dass die Verladung eines schweren Seite wird nicht blockiert die gui-thread.
Ich glaube, ich bin in der Lage schriftlich threads im Allgemeinen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TWebBrowser
bereits downloads Sachen in einem separaten thread. Das Programm sollte schon bleiben, reagieren, während es heruntergeladen wird. Sie können dies sehen, da ein häufiges Muster ist, um die URL ein, und warten Sie, bis der download abgeschlossen ist:Verwendet
ProcessMessages
, so kann ich nicht in gutem glauben empfehlen es. Benachrichtigt werden, wenn der download abgeschlossen ist, anstelle von polling wie der code funktioniert, handle des SteuerelementsOnNavigateComplete2
Veranstaltung. Beachten Sie, dass das Ereignis kann ausgelöst werden, für die Rahmen sowie die main-Seite.Wenn Sie wollen display die Seite, dann ist Ihr
TWebBrowser
Kontrolle sollte nicht in einem separaten thread sowieso, weil es fällt unter die gleichen Regeln wie für jede andere Steuerung verwendet, mit der VCL. Wenn Sie nur mit der Steuerung zu download eine Seite, dannTWebBrowser
wäre des guten zuviel. Sie verwenden konnte, Indy, oder das Betriebssystem gebaut-in-Datei-Download-Funktion. Diese können verwendet werden, in separate threads leicht.Ich brauchte die gleiche (um automatisierte screenshots der Seiten), und ich habe mit Rob ' s code.
Es hat nicht funktioniert für die Seiten, die ich am laden war.. die Hälfte der Zeit das busy-flag nicht gesetzt wurde, während Sie deutlich die Seite war noch nicht fertig.
Nach einigen Recherchen schien dies zu funktionieren:
wo readystate ist eine der folgenden:
Die Idee, die readystate-von hier stammt:
http://gaskell.org/making-the-webbrowser-control-synchronous/
Die readystate-delphi-Konstanten wurden hier entnommen:
http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_properties.htm
Muss ich sagen, dass ich noch nie versucht haben, etwas ähnliches, aber ich würde davon ausgehen, dass Sie auf Probleme stoßen.
Können Sie mehrere threads in einem Prozess, alle implementieren von message-loops und die Bearbeitung der Nachrichten für das windows von diesem thread, aber die Fenster sind alle gebunden an den thread, der Sie erstellt hat. Windows-Meldungen, die immer behandelt werden, in der der thread, der das Fenster erstellt wurde. So könnten Sie in der Lage sein, eine Methode aus der embedded TWebBrowser-Steuerung aus einem anderen thread, aber da dies beinhaltet das senden einer Nachricht an das web-browser-Fenster werden Sie noch behandelt werden im GUI-thread.
Für mehr Informationen check out Wikipedia-Artikel über COM-Threading in und die blog-Beiträge von Raymond Chen über die STA, wie diese eine.