Entwickler-Ecke

Sonstiges (.NET) - Mehrere Prozesse parallel


GURKE deluxe - Fr 01.10.10 15:43
Titel: Mehrere Prozesse parallel
Hallo,
Ich habe ein Programm geschrieben welches eventuell mehrere Minuten braucht. Wenn dieser Prozess nun am laufen ist, kann ich mit dem Programm nichts anderes mehr machen.

Gibt es die Möglichkeit, den Fortschritt anzeigen zu lassen? Und kann man die Oberfläche getrennt berechnen lassen, das man diese u.a. noch bewegen, normal schließen, etc. kann?

Gruß
GURKE


Th69 - Fr 01.10.10 16:04

Ja, da gibt es mehrere Möglichkeiten.

Lies dir mal folgende 2 FAQ-Beiträge aus dem MyCSharp-Forums dazu durch:
Warum blockiert mein GUI? [http://www.mycsharp.de/wbb2/thread.php?threadid=27992]
Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) [http://www.mycsharp.de/wbb2/thread.php?threadid=33113]

Gerade für einen Fortschrittsbalken bietet sich auch der 'BackgroundWorker' an...


GURKE deluxe - Fr 01.10.10 22:32

Moin Th69,
Danke für deine Antwort! Habe mir Teile durchgelesen. Und auch ein kleines Testprogramm geschrieben:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
        private void button2_Click(object sender, EventArgs e)
        {
            new Thread(TestDauerläufer).Start();
        }
        private void TestDauerläufer()
        {
            for (int i = 0; i < 100000; i++)
            {
                //for (int j = 0; j < 1000000; j++)
                //{
                    for (int k = 0; k < 1000000; k++)
                    {
                        int[] ABC = new int[10000];
                    }
                //}
                //progressBar1.Value = i;
                this.Invoke(new MethodInvoker(DoCheapGuiAccess));
            }
        }
        private void DoCheapGuiAccess()
        {
            progressBar1.Value = progressBar1.Value + 1;
        }


Funktioniert tatsächlich alles so wie es soll! Danke nochmals!

Gruß
GURKE

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


GURKE deluxe - Sa 02.10.10 09:28

So, ich bins nochmal.
Ich habe nun ein Problem mit dem Code:
Mein kompletter Zeitfressender Code steht nun im Bereich wo hier die beiden Schleifen stehen. Dieser Code braucht einige Informationen von der Oberfläche. Wenn ich den Code starte kommt der Fehler der schon beschrieben wurde ("Unzulässiger threadübergreifender Vorgang" bzw. "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement 'Name des Steuerelements' erfolgte nicht von dem Thread aus, in dem das Steuerelement erstellt wurde." (*)).

Wie komme ich nun an Daten der Oberfläche?

Gruß
GURKE


Delete - Sa 02.10.10 12:08

Übergebe sie an den Thread, bevor du ihn startest.


Kha - Sa 02.10.10 22:35

Und zwar über die Überladungen des Thread-Konstruktors und Start, über die du ein Objekt übergeben kannst :) . Über anonyme Methoden ging es auch noch einfacher.


GURKE deluxe - So 10.10.10 19:41

So lange arbeite ich nocht nicht mit C# ;)

Also was soll ich jetzt genau machen? Am besten mit Beispiele :D.


Delete - So 10.10.10 19:48

Thread-Tutorials sollte es eigentlich genug im Internet geben.