![]() |
TWebbrowser + Application.ProcessMessages = Probleme?
Hallo,
sind irgendjemandem schon einmal Freeze-Probleme bei der Benutzung des TWebBrowsers sowie des Befehls Application.ProcessMessages untergekommen? Konkret möchte ich innerhalb einer Prozedur darauf warten dass der TWebBrowser eine Website fertig geladen hat und benutze dafür folgende Wartefunktion:
Delphi-Quellcode:
Mein Programm prueft ob das Ready-Ereignis des TWebBrowsers ausgelöst worden ist und ruft ansonsten die obenstehende Funktion mit jeweils einer Sekunde Wartezeit auf.
procedure Wait(Secs: Cardinal);
var ActualTime, LastTime, WaitingTime: Cardinal; begin if Secs = 0 then exit; WaitingTime := Secs*1000; LastTime := GetTickCount; While true do begin //Endlosschleife welche durch break beendet wird Application.ProcessMessages; sleep(1); ActualTime := GetTickCount; if LastTime > ActualTime then begin //GetTickCount wurde von Windows zurueckgesetzt LastTime := ActualTime; Continue; end; if ActualTime - LastTime >= WaitingTime then break;; end; end; Diese Kombination aus dem laufenden Laden einer URL innerhalb des WebBrowsers und dem Aufruf von Application.ProcessMessages führt jedoch manchmal zu einem kompletten Freeze der Anwendung. In einem solchen Fall läuft die Anwendung einwandfrei bis zum Erreichen des ProcessMessages-Befehl um diesen nie wieder zu verlassen. Hat jemand schon einmal etwas ähnliches beobachtet oder gar eine Lösung gefunden? Im Internet finden sich verschiedentliche Spuren ähnlicher Probleme, beispielsweise ![]() Zitat:
Viele Grüße und Danke im Voraus, Martin Kumeran |
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Es ist auch keine gute Idee darauf zu warten. Windows ist ereignisorientiert und deshalb sollte man auch einfach die entsprechenden Ereignisse benutzen, dann stellt sich das Problem gar nicht erst... :roll:
Zum Beispiel: ![]() |
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Zitat:
|
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Dann ist dein Konzept schlecht durchdacht...
Du könntest es einmal ohne Sleep versuchen, vielleicht liegen die Probleme auch da begründet, denn während der Zeit ist das Programm schließlich stillgelegt... Stattdessen gibt es Delay, dabei brauchst du nicht einmal selbst Application.ProcessMessages einzusetzen: ![]() |
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Warum eigentlich warten. reagiere doch auf die Fertigmeldung (.onDocumentComplete())
|
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Habe ich ja geschrieben, aber er hat offenbar ein so schlechtes Konzept, dass er das da schlecht einbauen kann...
|
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Scheinbar mögen die meisten keine "guten" Lösungen sondern sind Stolz es möglich dreckig lösen zu können. in der zeit in dem man diesen "Mist" ausbaldovert könnte man es auch gut richtig machen und alles würde funktionieren. Dirty code hingegn erzeugt meist Nebeneffekte und deshalb Folgefehler.
|
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Ich weiß nicht ob man mir unbedingt ein schlechtes Konzept unterstellen kann, ab einem bestimmten Komplexitätsgrad wird einfach ein vollkommen unübersichtlicher QuellCode geschaffen wenn man ständig aus einer Funktion hüpfen muss um sie nach Eintreten eines Ereignisses durch einen erneuten Aufruf wieder fortzusetzen, gerade wenn man mit Schleifen und Verzweigungen arbeitet.
Ich habe meine Funktion mit der von jaenicke vorgeschlagenen ersetzt um das Sleep zu vermeiden, leider tritt der selbe Effekt weiterhin auf wenn der Befehl Application.ProcessMessages ausgeführt wird. Um zu prüfen was das Programm genau macht habe ich mir ein Log der Message-Abarbeitung der Anwendung ausgeben lassen, der von mir sogenannte Freeze ist streng genommen keiner, ankommende Messages werden weiter verarbeitet - allerdings mit einer ewigen Unterbrechnung von teilweise mehreren Minuten indem anscheinend die TWebBrowser-Komponente intern (?) irgendetwas macht. Die reine Abarbeitung des MessageQueues funktioniert gut. Application.ProcessMessages ist eben doch mehr als ein reiner Befehl zum Abarbeiten der anstehenden Messages. Nach einer Ewigkeit wird der ProcessMessages-Befehl dann tatsächlich auch beendet, das Ganze kann aber durchaus 10 Minuten und mehr dauern... |
Re: TWebbrowser + Application.ProcessMessages = Probleme?
Zitat:
Ich unterteile die verschiedenen Aufgaben in einzelne Module. Und wenn ich zum Beispiel mit Indy Daten aus dem Internet herunterlade, dann kapsele ich das ggf. in Klassen. Diese wiederum reagieren auf die diversen Events und leiten diese ggf. wiederum via Event weiter. TWebBrowser benutze ich dafür allerdings nicht, da ich keine visuelle Darstellung brauche und TWebBrowser dann ja außer für JavaScript oder so Schwachsinn wäre. Ich weiß, dass es eine Umstellung ist voll ereignisorientiert zu denken und zu entwickeln, aber insbesondere bei komplexeren Aufgaben führt daran kaum ein Weg vorbei... Muss es denn TWebBrowser sein? Welche Funktionen brauchst du denn genau? Reine visuelle Darstellung von Webseiten bieten auch andere Komponenten teilweise. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz