Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Fr 20.02.09 21:07 
Für folgendes neues Problem suche ich eine saubere Lösung.

Ich habe einen lang laufenden Thread in welchem Bildmaterial aufbreitet wird. In der Natur des Threads liegt eine permanente UI Interaktion, da die aufbereiteten Bilder ständig angezeigt werden sollen. Dadurch entsteht das Problem, dass Threading einerseits nicht greift und ich andererseits Probleme kriege die UI ansprechbar zu halten. Eigentlich denke ich, dass es nicht Aufgabe meines Threads ist sich um die UI zu kümmern, weshalb ich auf application.doevents aktuell verzichte. Ich habe verschiende Tests durchgeführt, mal mit begininvoke, mal mit invoke, und derzeit ganz ohne Threading. Alle Versuche waren aber nicht befriedigend. Unter Vista tritt ein weiterer unschöner Effekt auf. Zwar funktioniert die Anwendung, aber nach kurzer Zeit friert meine Anwendung ein, und dieser kleiner runder Kreis erscheint (unter XP wäre es die Sanduhr). Sobald die Berechnungen abgeschlossen sind reagiert die Anwendung wieder.

Im Internet habe ich zu diesem Thema verschiede Lösungsansätze gesehen, aber die scheitern daran, dass mein Thread sich eigentlich nicht vom UI Thread trennen lässt. Wenn ich treading einsetzen wollte, müsste ich alles was der Thread macht vom UI Thread invoken.

Als Beispiel der aktuelle Programmcode ohne Threading. Das Invoke ist noch drin weil es die Situation zumindest teilweise verbessert.

Was ich suche ist ein Ansatz, wie ich erreiche, dass meine UI ansprechbar bleibt.

ausblenden 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 create_input_samples_Click(object sender, EventArgs e)
        {           
            UI_ImgC[] myuis_imgc = new UI_ImgC[this.Fparallel_instances];
            ImgC.ImgC[] myimgcs = new ImgC.ImgC[this.Fparallel_instances];

            Invoke(new MethodInvoker(delegate()
            {
                for (int i = 0; i < this.Fparallel_instances; i++)
                {
                    myuis_imgc[i] = new UI_ImgC();
                    myimgcs[i] = new ImgC.ImgC(this.Fxm, this.Fym, this.Fimg_depht, this.Fimg_cnt, myuis_imgc[i].pictureBox1, this.richTextBox1, i);
                    myuis_imgc[i].Visible = true;

                    try
                    {                                                
                        myimgcs[i].create_samples(this.Fn_ics, this.Ffilename_samples_check);  // massiver Zugriff auf eine Picturebox
                    }
                    catch (Exception E) { this.Fmaster_status.Msg(true"Error creating samples." + " " + E.Source + " " + E.Message); return; }

                    myuis_imgc[i].Visible = false;
                }
            }));
        }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 20.02.09 23:00 
user profile iconfuncry hat folgendes geschrieben Zum zitierten Posting springen:
In der Natur des Threads liegt eine permanente UI Interaktion, da die aufbereiteten Bilder ständig angezeigt werden sollen.
Ist es denn wirklich nicht möglich, die Bilder in einem Nebenthread zu bearbeiten und das Ergebnis an den GUI-Thread zu schicken? Wenn nicht, dann wird eine Schleife mit DoEvents die einzige Möglichkeit sein :nixweiss: .

_________________
>λ=
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Sa 21.02.09 14:00 
Danke für den Hinweis. Damit ist klar dass ich meine Bilderzeugung entsprechend umarbeiten muss um eine Verbesserung zu erziehlen.