Probleme mit darstellung aufgrund der Systemlast



  • Hi,

    ich habe vor kurzem ja bereits mein Problem mit dem WebBrowser-Control (IWebBrowser2) in verbindung mit dem Internet-Explorer 7.0 geposted.

    Dem Problem bin ich nun mehr oder weniger auf die Schliche gekommen. Das WebBrowser-Control hat scheinbar Probleme, wenn es von einem Thread aus aufgerufen wird.

    Das Problem ist aber, das ein großteil der Anwendung in einem Thread läuft. Dies habe ich nun geändert mit dem Resultat, das zwar alles läuft, die CPU-Last aber auf 100% schnellt...

    Die Folge ist, das die Darstellung im WebBrowser-Control nicht richtig erfolgt. Es wird zwar was angezeigt, aber ein Animated-Gif z.B. läuft in dem moment nicht. Unter umständen sollen dort auf Flash-Animationen dargestellt werden.
    Aus diesem Grund wurde ja auch der Thread eigentlich implementiert, nur das der IE7 nun alles verhagelt...

    Hat von euch vielleicht jemand eine Idee, wie ich das nun lösen könnte?

    mfg
    Manuel


  • Mod

    Das ist kein Problem des Web Browser Controls. Das ist ein grundsätzliches Problem aller Fenster. Solange keine Nachrichtenschleife läuft wird auch kein WM_PAINT versendet. Du kannst das zwischenzeitlich durch ein UpdateWindow forcieren (was bei einem COM Control schwierig ist).
    Oder zu führst zwischendrin eben einen PeekMessage durch und arbeitest dann weiter.
    Oder du lagerst die Arbeit in einen eigenen Thread aus, und der Mainthread bedient weiter die UI.



  • Martin Richter schrieb:

    Oder du lagerst die Arbeit in einen eigenen Thread aus, und der Mainthread bedient weiter die UI.

    Genau so hatte ich es ursprünglich und es funktionierte mit dem IE6.0 auch ganz gut. Nur muss von dem "Arbeits"-Thread eine weitere HTML-Seite geöffnet werden. Hierzu verwendet man ja eigentlich die .Navigate()-Methode.
    Und genau an dieser Stelle hakt es nun mit dem IE7.0. Sobald sich das Programm nichtmehr im Main-Thread befindet, kann ich mit der .Navigate()-Methode keine andere Seite mehr öffnen.
    Daher nun der kleine Workaround ohne diesem Thread... Ich hoffe ja noch, das es in dem Final-Release des Internet Explorers wieder funktioniert, falls nicht muss ich es bis dahin zum laufen bekommen haben...

    Ich schau aber mal eben wie das mit der PeekMessage funktioniert 😉

    Grüße
    Manuel



  • [quote="Manuel79"]

    Martin Richter schrieb:

    Genau so hatte ich es ursprünglich und es funktionierte mit dem IE6.0 auch ganz gut. Nur muss von dem "Arbeits"-Thread eine weitere HTML-Seite geöffnet werden. Hierzu verwendet man ja eigentlich die .Navigate()-Methode.
    Und genau an dieser Stelle hakt es nun mit dem IE7.0. Sobald sich das Programm nichtmehr im Main-Thread befindet, kann ich mit der .Navigate()-Methode keine andere Seite mehr öffnen.

    Warum muß denn der Arbeits-Thread alles selber erledigen? Er kann doch genausogut eine Notiz an den Haupt-Thread hinterlassen, der sich dann bei nächster Gelegenheit darum kümmert (z.B. in der OnIdle())



  • Das Hauptproblem sind die 100%. DU kannst zwar immer dran rum murksen, aber Du solltest Dein Hauptproblem lösen.

    Warum brauchst Du 100%? Ich kenne keinen Anwendungsfall woe dies wirklich nötig ist... stell Deine Arbeitsweise auf Ereignissteuerung um.



  • Jochen Kalmbach schrieb:

    Das Hauptproblem sind die 100%. DU kannst zwar immer dran rum murksen, aber Du solltest Dein Hauptproblem lösen.

    Warum brauchst Du 100%? Ich kenne keinen Anwendungsfall woe dies wirklich nötig ist... stell Deine Arbeitsweise auf Ereignissteuerung um.

    Ich brauche die 100% eigentlich auch nicht bzw. will ich sie auch garnicht. In dem "Arbeits-Thread", welcher jetzt in den Main-Thread geflossen ist, werden einige Zip-Dateien entpackt und anschließend wird ein Web-Server eingerichtet und gestartet. Diese Aufgaben nehmen sich dann die Systemleistung.



  • Du musst für die Aufgaben einen eigenen Thread machen und den nötigenfall eine niedrigere Priorität geben, wenn die GUI wichtiger ist.



  • Hi nochmal...

    also gestern wollte ich eigentlich einmal versuchen, ob ich vielleicht über ein Event das Navigate ausführen kann.

    Problem an der Sache ist nur, das ich kein Event gefunden habe welches Ausgelöst werden könnte.

    Bei der Anwendung handelt es sich um ein CDialog. Dies hat leider kein OnIdle()-Event. Nur ein OnEnterIdle(), welches eintritt (zumindest wenn ich es richtig verstanden habe) wenn auf eine Eingabe gewartet wird. Dies kommt jedoch nicht vor.

    Das blöde ist auch, das nach dem "Arbeits"-Thread erst wieder was geschieht, wenn die Anwendung geschlossen wird. In der Zwischenzeit soll der User sich in einer Java-Applikation austoben.

    Kann ich denn irgendwie ein Event erzwingen? Und wenn ja, wie muss ich darauf reagieren? Das wäre noch eine Idee die ich hätte, weiß nur noch nicht wie ich sie umsetzen soll...

    Grüße
    Manuel


  • Mod

    Nein! Du kannst in einem COM STA nicht "geleichzeitig" erzwingen!
    Bau zwei Threads und Punkt!


Anmelden zum Antworten