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!
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
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...
@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.
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
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?
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.
@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