Laden...

Form aus Sekundärthread updaten

Erstellt von Aschratt vor 17 Jahren Letzter Beitrag vor 16 Jahren 1.473 Views
Aschratt Themenstarter:in
97 Beiträge seit 2007
vor 17 Jahren
Form aus Sekundärthread updaten

Hi!

Ich hab mal eine Frage. Und zwar habe ich eine Ziemlich lange Rutine geschrieben, die aus einer genau so ziemlich großen Datei Daten in eine ListView schreibt.
Problem: Wenn ich auf die Form Klicke (Irgendwo), dann stürtzt das Fenster ab. Also das heißt der Prozess läuft (Wenn auch langsamer) weiter, aber das Programm macht den Anschein, als wäre es abgestürtzt.

Ich habe also versucht in einen Seperaten Thread, der im Hintergrund permanent läuft, die Form dauerhaft neu zu zeichnen (Form1.Refresh).

Allerdings bekomme ich immer eine Zugriffsverletzung, weil die Form ja im anderem Thread läuft.

Kennt einer eine andere Möglichkeit (evtl schneller und besser) oder weiß eine Lösung für das Problem?!

Danke schonmal für Antworten! 😉

M
402 Beiträge seit 2005
vor 17 Jahren

Hi!

Schau mal in den FAQ.
Dort gibts Threads zu den Themen

[FAQ] Warum blockiert mein GUI?
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

lg

//edit:
links für die threads eingefügt!!

Aschratt Themenstarter:in
97 Beiträge seit 2007
vor 17 Jahren

So weit ich das verstanden habe geht es hierbei darum über den normalen GUI Thread alles zu aktualisiern.

Allerdings geht das bei mir nicht, da ich ja auch eine Progressbar und eine ListView aus einem anderem Thread zugreifen müsste.
Das heißt ich müsste einen Hintergrund-Thread laufen lassen, der so aussieht:

private void ImportMenuItem_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(new ThreadStartet(ImportInvoker));
    thread.Start();
    //...
    thread.Abort();
}

void ImportInvoker()
{
    if(this.InvokeRequired)
    {
        Invoke(new MethodInvoker(ImportMenuItem_Click));
    }
}

Da aber ImportMenuItem bereits vom Typ EventManager ist, ist es eine ungültige Methode für MethodInvoker (jedenfalls bekomm ich einen fehler).

Oder soll ich aus einem neuen Thread in die ListView added. (Wie geht das überhaupt... da kommt auch n Fehler!)

Thx! MfG!

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Aschratt,

doch die FAQ ist schon richtig und passt auch für deinen Fall. Bitte lies die noch mal gründlich und in Ruhe.

herbivore

Aschratt Themenstarter:in
97 Beiträge seit 2007
vor 17 Jahren

So Freunde der Sonne. Es geht jetzt.

Das einzige komische war, dass der Debugger einen Fehler bringt, wenn ich die ListViewItems von einem seperaten Thread aus adde. Das Programm hingegen wird ja compiliert, und wenn man dann im Projektordner\bin\Debug Die exe ausführt Funktioniert es ohne Fehler.

Danke nochmal! 👍

M
123 Beiträge seit 2007
vor 16 Jahren

😉
Nur dabei verstößt Du gegen die oberste Regel was Multithreading und GUI's angeht!
Es funktioniert...manchmal...bei Dir...wenn Du Glück hast...
Der Debugger warnt Dich nicht umsonst...