Laden...

Backgroundworker während Ausführung neue Variablenwerte übergeben.

Erstellt von snowy vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.412 Views
S
snowy Themenstarter:in
143 Beiträge seit 2009
vor 14 Jahren
Backgroundworker während Ausführung neue Variablenwerte übergeben.

Hallo,

Ich habe einen BGW in einer statischen Klasse definiert. Dieser führt keine intensive Berechnung aus sondern sendet zyklisch Botschaften (CAN-BUS) solange bis ich ihn wieder beende.

Bei dem Start übergebe ich in arg Variablenwerte für die Botschaften:

bgwmDiagnose1.bgwmDiag1.RunWorkerAsync(arg)

Ich möchte jetzt während der BGW bereits läuft, diese Variablenwerte ändern können damit sich das Verhalten der Botschaften ändert.

Wie mach ich das?

Danke!

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo snowy,

pack die Daten, die veränderlich sind doch in eine Externe Klasse

und benutze diese einfach während der Ausführung des Backgroud-Workers

Herzliche Grüße
BlackCoin

3.971 Beiträge seit 2006
vor 14 Jahren

Dieser führt keine intensive Berechnung aus sondern sendet zyklisch Botschaften (CAN-BUS) solange bis ich ihn wieder beende.

Nimm dazu lieber einen Timer (System.Threading.Timer beispielsweise)

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
snowy Themenstarter:in
143 Beiträge seit 2009
vor 14 Jahren

@kleines_Eichhoernchen:

Es laufen viele solcher BGW parallel und noch andere Sachen. Das ist schon gut so wie es ist.

@blackcoin:

Ich verstehe nicht genau wie Du das meinst.

Derzeit wird der BGW aus einer anderen Klassen in einer Funktion gestartet. von dort aus muss ich auch beliebig dann die Variablen ändern können.

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo Snowy,

zb beispiel könntest du folgendes machen

public class BWStarter {
            public void RunBW(Einstellungen einstellungen){
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);

                bw.RunWorkerAsync(einstellungen);



                //an diser Stelle kannst du dann die Eigenschaften ändern
            }

            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                Arbeite(e.Argument as Einstellungen);    
            }

            private void Arbeite(Einstellungen einstellungen)
            {
                //an dieser stelle kannst du die Eigenschaften benutzen
            }
        }

        public class Einstellungen{
            //In dieser Klasse sind die Einstellungen enthalten 
            //Hint:Locking
        }

Herzliche Grüße
BlackCoin

S
snowy Themenstarter:in
143 Beiträge seit 2009
vor 14 Jahren

Danke für das Beispiel!

In einem Windows.Forms Projekt habe ich einen Button und eine Listbox zur Ausgabe.


 private void button1_Click(object sender, EventArgs e)
        {
            Einstellungen einstellungen = new Einstellungen(); ;

            //Initialwert
            einstellungen.iWert=1;

            RunBW(einstellungen);
        }

        public void RunBW(Einstellungen einstellungen)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            
            bw.RunWorkerAsync(einstellungen);

            //an dieser Stelle kannst du dann die Eigenschaften ändern
            einstellungen.iWert = 10;
            Thread.Sleep(2000);
            Application.DoEvents();

            einstellungen.iWert = 20;
            Thread.Sleep(2000);
            Application.DoEvents();

            einstellungen.iWert = 30;
            Thread.Sleep(2000);
            Application.DoEvents();
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            do
            {
                Arbeite(e.Argument as Einstellungen);
                Thread.Sleep(100);
            } while (true);
        }

        public delegate void delegateWriteMessage(Einstellungen einstellungen);

        private void Arbeite(Einstellungen einstellungen)
        {
            //an dieser stelle kannst du die Eigenschaften benutzen
            if (this.InvokeRequired == false)
            {
                listBox1.Items.Add("Wert = " + einstellungen.iWert.ToString());
            }
            else
            {
                delegateWriteMessage writeMsg = new delegateWriteMessage(Arbeite);
                this.Invoke(writeMsg, new object[] { einstellungen });
            }
        }
   
        public class Einstellungen
        {
            //In dieser Klasse sind die Einstellungen enthalten
            public int iWert;
        }

Ich erhalte die Ausgabe:

10
20
30
30
30
30
...

Müsste aber nicht 2 Sekunden lang
10
10
10

und dann 2 Sekunden lang
20
20
20

usw. erscheinen?

5.299 Beiträge seit 2008
vor 14 Jahren

Habichjetzt auchn Sample gemacht.
Aber ich komme zu dem gleichen Schluß wie Eichhörnchen.
Wenns viele davon gibt, dann nimm halt viele Timer. Aber guckdirmal Sample.

Der frühe Apfel fängt den Wurm.

S
snowy Themenstarter:in
143 Beiträge seit 2009
vor 14 Jahren

@Erfinder:

Danke für das Beispiel.

Um das 100% zu verstehen, langen meine Kenntnisse noch nicht aus in C# - Programmierung.
Ich möchte auch meinen bisherigen Code nicht ändern, da das Projekt sehr umfangreich ist.

Deshalb habe ich nach "KISS" (Keep it short and simple) 😃 einfach eine Variable in der statischen BGW-Klasse angelegt. Diese verwende ich aus der externen Funktion um neue Werte einzugeben und in der DoWork() um diese zu verwenden.

Danke trotzdem für eure Hilfe!

VG