Laden...

Gecko FX Control: Form hängt

Erstellt von Whinyowea vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.386 Views
Thema geschlossen
W
Whinyowea Themenstarter:in
56 Beiträge seit 2009
vor 10 Jahren
Gecko FX Control: Form hängt

Hi Leute,

Ich benutze das Gecko FX Control welches als "Ersatz" zum Internet Control dient.
Das Aktionen im Control vom UI Thread ausgeführt werden müssen ist sicher bekannt, so wird jede Aktion die ich also mache im Gecko Browser Control auch die UI lahmlegen.
Beim Internet Explorer habe ich einfach über das ActiveXInstance Objekt auf das Dom Document zugegriffen. Wie mache ich das bei dem Gecko FX kontroll? Ich will nämlich einfach nur par Mausklicks Simulieren (Aber in mehreren Controls glecihzeit, sodas der User auch immernoch die Form bedienen kann)

MfG Iwan

Alle haben gesagt es geht nicht, dann kam einer der hat das nicht gehört und hat es gemacht.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Whinyowea,

also ich werde aus deinem leider Text nicht ganz schlau.

Richtig ist: Alle Zugriffe auf ein Control müssen aus dem GUI-Thread erfolgen. Das bedeutet aber nicht, dass ein Zugriff zwangsläufig das GUI blockiert, denn das tut es nur, wenn die ausgeführte Aktion (deutlich) länger (als 1/10s) dauert. Außerdem sind Webbrowser-Controls normalerweise so schlau, längere Aktionen automatisch in einem extra Thread auszuführen.

Mir ist also nicht klar, was genau du tust und warum das Form blockiert. Das müsstest du wohl etwas genauer beschreiben.

Außerdem passt die Frage, nämlich wie man beim Gecko FX Control über das ActiveXInstance Objekt auf das Dom Document zugreifen kann bzw. wie man Mausklicks simuliert, nicht zum Titel.

Was genau ist deine eigentliche Frage?

herbivore

W
Whinyowea Themenstarter:in
56 Beiträge seit 2009
vor 10 Jahren

Hallo herbovore,

danke für die Antwort. Meine Frage ist wie ich mehrere Gecko FX controls zu einer Form hinzufügen kann und diese im Hintergrund ansteuern, ohne das die Controls zusammen mit der Form einfrieren.

Weil wenn ich in meinem Beispiel Folgenden Code ausführe. (Aufgerufen mit Control.BeginInvoke)


string text = "xyz";
for(int i = 0; i< text.Length; i++)
            {
                char c = text[i];
                nsIDOMKeyEvent Event = Xpcom.QueryInterface<nsIDOMKeyEvent>(this.window.DomWindow.GetDocumentAttribute().CreateEvent(new nsAString("KeyEvents")));
                Event.InitKeyEvent(new nsAString("keydown"), true, true, null, false, false, char.IsUpper(c), false, (uint)c, (uint)0);
                Xpcom.QueryInterface<nsIDOMEventTarget>(this.element.DomObject).DispatchEvent(Event);
                Event = Xpcom.QueryInterface<nsIDOMKeyEvent>(this.window.DomWindow.GetDocumentAttribute().CreateEvent(new nsAString("KeyEvents")));
                Event.InitKeyEvent(new nsAString("keypress"), true, true, null, false, false, char.IsUpper(c), false, (uint)c, (uint)0);
                Xpcom.QueryInterface<nsIDOMEventTarget>(this.element.DomObject).DispatchEvent(Event);

                string val = element.GetAttribute("value");
                val += c.ToString();
                element.SetAttribute("value", val);

                Event = Xpcom.QueryInterface<nsIDOMKeyEvent>(this.window.DomWindow.GetDocumentAttribute().CreateEvent(new nsAString("KeyEvents")));
                Event.InitKeyEvent(new nsAString("keyup"), true, true, null, false, false, char.IsUpper(c), false, (uint)c, (uint)0);
                Xpcom.QueryInterface<nsIDOMEventTarget>(this.element.DomObject).DispatchEvent(Event);

                Thread.Sleep(2000);
            }

Dann werden die Events richtig ausgeführt, jedoch wartet das Control 6 Sekunden und feuert alle Events direkt Nacheinander ab. Ebenfalls bleibt die Form eingefroren wärend der 6 Sekunden. Wieso und was kann ich dagegen machen?

MfG Iwan

Alle haben gesagt es geht nicht, dann kam einer der hat das nicht gehört und hat es gemacht.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Whinyowea,

die Antwort steht quasi schon in meiner vorigen Antwort, denn wenn du eine Aktion ausführst, die deutlich länger dauert (vor allem: x mal Thread.Sleep(2000)), blockiert das GUI natürlich. Vor allem aber steht die Antwort in der FAQ, siehe [FAQ] Warum blockiert mein GUI?, insbesondere Abschnitt "Timer statt Threads".

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.

herbivore

Thema geschlossen