Laden...

Threading Kommunikation zwischen Form und (abzubrechender) langlaufender Aktion

Erstellt von i06001 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.243 Views
I
i06001 Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren
Threading Kommunikation zwischen Form und (abzubrechender) langlaufender Aktion

Hallo zusammen,

ich habe folgendes Problem:

Ich habe 3 Klassen -

  • eine Klasse Form1, auf der ein DataGridView, eine Textbox in der ein Suchwort eingetragen werden kann und ein Button, der die Suche startet, platziert sind
  • eine Klasse Mittelung, die nichts weiter ist als ein Fenster mit "Abbrechen" Button
  • eine Klasse Suche, die mir die Suche auf dem DataGridView durchführt

Die Suche funktioniert ohne Probleme - ich möchte jedoch mit der Klasse Mitteilung die Suche jederzeit abbrechen können, falls dem User die Suche zu lange dauert.

Die Klasse Form1 ruft zuerst die Klasse Mittelung in einem eigenen Thread auf und führt dann die Suche durch


                MitteilungBox mitteilungBox = new MitteilungBox();
                mitteilungBox.FormClosing += new FormClosingEventHandler(mitteilungBox_FormClosing);

                ThreadStart starter = null;
                starter = delegate { mitteilungBox.ShowDialog(); };
                thread = new Thread(starter);
                thread.Start();
                
                search = new Search(dataGridViewTable);
                search.Find(comboBoxSearchFor.SelectedItem.ToString(), textBoxSearchtext.Text);

Wie teile ich jedoch nun meiner aktiven Suche mit, dass in dem Fenster der Klasse Mitteilung der "Abbrechen" Button gedrückt wurde?
Hier ein Ausschnitt der Suchklasse:


                for (int i = startIndex; i < dgv.Rows.Count; i++)
                {
                    if (AbortSearch)
                    {
                        AbortSearch = false;
                        dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
                        break;
                    }
                    DataGridViewRow row = dgv.Rows[i];
                    string val = row.Cells[column].Value as string;
                    if (val.Contains(key))
                    {
                        dgv.ClearSelection(); row.Selected = true;
                        dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
                        return;
                    }
                }

Ich stehe momentan ein wenig aufm Schlauch - ich hoffe ich konnte es einigermaßen verständlich machen was ich will 😃

Wäre super wenn man mir helfen könnte - im Voraus vielen Dank!

MfG
i06001

916 Beiträge seit 2008
vor 13 Jahren

Du könntest ein Event implementieren welches die Abbrechen Klasse feuert und die Klasse die den Thread startet abonniert. Nach dem feuern einfach das interne Flag auf true setzen, und die Thread bricht ab indem er seine Ihm zugeteilte Methode verlässt.

Again what learned...

S
902 Beiträge seit 2007
vor 13 Jahren

HAllo,

du solltest das etwas anders lösen:

Ich halte es für besser, wenn die eigentliche Aufgabe in einen seperaten Thread kommt, und NICHT das öffnen eines Dialoges.

Starte in Form1 deine Suche in einem eigenen Thread und öffne aus Form1 heraus danach den Dialog.
Wenn Abbrechen geklickt wurde, wurde dies per Event an Form1 mitgeteilt, welches eine Abbruchvariable auf true setzt.
Der Thread, welcher die Suche ausführt, sollte diese VAriable prüfen, und ggf abbrechen.

Noch besser wäre es wohl, einfach den BackgroundWorker zu verwenden.

Wenn du .net 4 verwendest, kannst du die Suche in einem Task starten lassen, und von Form1 aus eine CancellationToken setzen.

mfg
serial

I
i06001 Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

Hallo,

vielen Dank für eure Antworten!

Also mit dem BackgroundWorker funktioniert es super.
Habe mich bis jetzt immer von dem BackgroundWorker ferngehalten - wie ich bemerke vollkommen grundlos....
Na ja, komme vom Land - und was der Bauer nicht kennt .... 😃

MfG
i06001