Autor Beitrag
mmp5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 02.09.10 11:30 
Hallo,
Ich habe eine Funktion die eine gewisse Zeit in anspruch nimmt um abgearbeitet zu werden. Die Funktion wird über einen Button ausgeführt.
innerhalb dieser Funktionen werden diverse dinge erledigt: lade ein Bild, berechne irgendwas etc.

Ich habe eine Textbox, die mir anzeigen soll, was gerade gemacht wird ...
z.B.: vor dem laden des Bildes:
ausblenden C#-Quelltext
1:
2:
3:
textbox1.text = "Bild wird jetzt geladen ... "
imgSrc = loadImage(); 
textbox1.text = "Bild Wurde geladen"


ich habs schon mit Dispatchertimer versuch aber klappt auch nicht ...
ich habs auch mit Binding und INotifyPropertyChange versucht klappt auch nicht ...
da muss es doch ne möglichkeit geben ...

wonach muss ich suchen?
hat einer ne Lösung?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 02.09.10 12:08 
Wo liegt das Problem? Du kannst doch innerhalb der Methode ganz normal auf die Komponenten zugreifen, zum Beispiel, um den Text eines Labels zu ändern.

Wenn du willst, dass das Fenster während der Aktion bedienbar bleibt, brauchst du Suche in der Entwickler-Ecke THREADS und Suche in der Entwickler-Ecke INVOKE, aber davon hast du ja gar nichts geschrieben...
mmp5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 02.09.10 12:38 
mhhh ich weis nicht ob ich für meine Aufgabe wirklich mit Threads arbeiten muss ...

hier ein wenig bspCode:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void button1_Click(object sender, RoutedEventArgs e)
{
            textBox1.Text = "1: Anfang";
            longTimeFunc();
            textBox1.Text = "2: Jetzt einmal durchlaufen";
            longTimeFunc();
            textBox1.Text = "3: jetzt zweimal durchlaufen und Fertig";
}

private void longTimeFunc()
{
            //System.Threading.Thread.Sleep(1000);
            int a = 0;
            for (int i = 0; i < 99999999; i++)
            {
                a += i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + a;
                a += i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + a;
            }
}


So, in der TextBox wird nur "3: jetzt zweimal durchlaufen und Fertig" angezeigt ...
Ich will aber, dass "1: ..." und "2: ..." auch angezeigt werden und zwar genau dann, wenn die im Programm an der Reihe sind ...

Ich weis nicht, ob das Bedienbar heißt?
Gehört anzeigen auch zu Bedienbarkeit?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 02.09.10 13:13 
Stimmt, da musst du noch eine Anweisung einfügen, nachdem du den Text geändert hast:

ausblenden C#-Quelltext
1:
textBox1.Refresh();					

Damit wird die Komponente neu gezeichnet.

user profile iconmmp5 hat folgendes geschrieben Zum zitierten Posting springen:
Ich weis nicht, ob das Bedienbar heißt?
Gehört anzeigen auch zu Bedienbarkeit?

Nein, mit Bedienbarkeit meinte ich, dass der Benutzer das Formular verschieben und auf andere Buttons klicken kann.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 02.09.10 13:50 
Alle langlaufenden Methoden (ca. >= 10ms) innerhalb von Eventhandlern sollten (besser: müssen!) in Threads ausgeführt werden (sonst meldet Windows dann: Fenster reagiert nicht mehr).
Als gute Alternative zu einem eigenen Thread kann man den BackgroundWorker benutzen und in dessen ProgressChanged-Ereignis dann die Aktualisierung der GUI-Elemente durchführen (die Eigenschaft 'WorkerReportsProgress' muß dann auf 'true' gesetzt sein!).

s.a. folgenden Beitrag: www.c-sharp-forum.de/viewtopic.php?t=91943