C# Event wenn sich eine Class Variable ändert

Gast #4921179
Hallo zusammen ich hab mal eine Frage zu C#.

Mein Main Programm erstellt eine Klasse welche wiederum einen eigenen 
Task aufmacht. Der Task ändert bei bestimmten Ereignissen eine Variable 
in der Klasse. Soweit so gut. Nun wollte ich aus der Klasse eine 
Funktion des Hauptprogramm aufrufen um die Anzeige zu ändern, leider hab 
ich keinen Plan wie das geht und wollte mal fragen ob ihr mir einen Tipp 
geben könnt (weiß leider auch nicht wonach ich genau googlen sollte :| )

Danke und VG Tom
Gast #4921217
Ich hoffe dein Programm erstellt ein Objekt einer Klasse ;) Wenn der 
Task eine Klassenvariable ändert, dann integrierst du die Überwachung 
entweder in die Klasse mit rein oder du erstellst eine globale 
Überwachung dieser Variable. Gibt es nur 1 Objekt dieser Klasse, dann 
könntest du sie als static-Variable deklarieren (für Punkt 2 geeignet). 
Wenn mehrere unabhängige Objekte erstellt werden, so würde ich es in die 
Klasse selbst integrieren. Wie ändert der Task die Variable? Direkt in 
dieser oder ähnlicher Form: class_object.var = XX; oder ruft der Task 
eine Methode der Klasse auf, die so sein könnte: 
class_object.changeVar(newXX);
Ich würde es über eine Methode realisieren und dann in der Methode diese 
Überprüfung reinsetzen

Um aus der Klasse heraus Methoden des Hauptprogrammes anzusteuern 
könntest du die Methoden public machen oder einfach static mit 
Parameterübergabe:
hauptklasse.machewas(param);

hier macht dann machewas(param) genau das was du ändern möchtest und 
erhält die Parameter, die geändert werden sollen
Gast #4921347
Hallo Werkstudent,

ich habe eine Klasse erstellt welche in meinen Programm als neue instanz 
erstellt wird:
1
SW_Simulation_Class sw_Simulation_Class = new SW_Simulation_Class ();

in der Klasse nutze ich eine Timer, welcher bei einem Tick Variablen 
ändert (bzw nicht jedesmal). Dazu hab ich eine Funktion in der Klasse 
welche die Änderung anzeigt
1
protected void OnChanged(EventArgs ea)

in meinem Hauptprogramm hab ich einen EventHandler eingebaut:
1
sw_Simulation_Class .Changed += new EventHandler(SimulationChanged);

und eine Funktion erstellt:
1
  public void SimulationChanged(Object objSender, EventArgs e)
2
        {
3
           Ch1ProgressBar.Value = 44;
4
        }

und bei dem Aufruf "Ch1ProgressBar.Value = 44;" sturzt mein program 
immer ab und ich bekomme eine Error Meldung (siehe Bild)

Danke für eure Hilf,

VG Tom
Angehängte Dateien:
Gast #4921354
mit
1
            try
2
            {
3
                Ch1ProgressBar.Value = 44; 
4
            }
5
            catch (Exception exc)
6
            {
7
                Console.WriteLine(Convert.ToString(exc));
8
            }

bekomme ich folgende Fehlermeldung:
1
System.InvalidOperationException: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Ch1ProgressBar erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
2
   bei System.Windows.Forms.Control.get_Handle()
3
   bei System.Windows.Forms.Control.SendMessage(Int32 msg, Int32 wparam, Int32 lparam)
4
   bei System.Windows.Forms.ProgressBar.UpdatePos()
5
   bei System.Windows.Forms.ProgressBar.set_Value(Int32 value)
6
   bei SW.infoGroupBox.SimulationChanged(Object objSender, EventArgs e) in C:\Users\**** \SW Form1.cs:Zeile 77.
7
Der Thread 0x29e0 hat mit Code 0 (0x0) geendet.

gibt es da eine Lösung?

Tom
Gast #4921406
Ich habe eine Lösung gefunden
1
public void SimulationChanged(Object objSender, EventArgs e)
2
{
3
  try
4
  {
5
    int Ch1ValueInt = bravo_SW_Simulation_Code.Ch1;
6
    int Ch2ValueInt = bravo_SW_Simulation_Code.Ch2;
7
    // ... etc ...
8

9
    Ch1ProgressBar.Invoke(new Action(() =>
10
    {
11
      Ch1ProgressBar.Value = Ch1ValueInt;
12
    }));
13
  }
14
  catch (Exception exc)
15
  {
16
    Console.WriteLine(Convert.ToString(exc));
17
  }
18
}

gibzt es noch eine elegante Lösung wenn ich gleich mehrere Änderungen 
z.B. auch
1
 Ch2ProgressBar.Value = Ch2ValueInt;
etc. ändern möchte?

Danke und VG

Tom
#4923373
@Dirk:
Es ist WinForms (siehe Namespaces im CallStack der Exception).

@Tom:
Du kannst das Invoke/BeginInvoke auch auf das übergeordnete Fenster oder 
UserControl anwenden. Per Definition "gehören" alle Controls eines 
Fensters zum selben Thread.
Kleiner Hinweis: Invoke wartet, bis der Delegate ausgeführt wurde 
(synchron) und BeginInvoke kehrt direkt zurück (asynchron).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.