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.
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); } catch (Exception E) { this.Fmaster_status.Msg(true, "Error creating samples." + " " + E.Source + " " + E.Message); return; }
myuis_imgc[i].Visible = false; } })); } |