C# Pumpensimulation

Neue Frage »

Auf diesen Beitrag antworten »
InformaTiger C# Pumpensimulation

Hallo,
in der Schule müssen wir ein Pumpensimulationsprogramm schreiben. Dabei habe ich folgenden Code:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
  private void Laufzeitueberpruefung()
          {
              while (true)
              {
                  if (!aPumpen[0] && aPumpen[1] && aPumpen[2])
                  {
                      this.pBNormalfall.Visible = true;
                      this.pBStoerfall.Visible = false;
                  }
                  else if (aPumpen[0] && !aPumpen[1] && aPumpen[2])
                  {
                      this.pBNormalfall.Visible = true;
                      this.pBStoerfall.Visible = false;
                  }
                  else if (aPumpen[0] && aPumpen[1] && !aPumpen[2])
                  {
                      this.pBNormalfall.Visible = true;
                      this.pBStoerfall.Visible = false;
                  }
                  else
                  {
                      this.pBNormalfall.Visible = false;
                      this.pBStoerfall.Visible = true;
                  }
                  Thread.Sleep(5000);
              }
          }


geschrieben, der mir allerdings folgene Fehlermeldung ausschmeißt:

InvalidOperationException wurde nicht behandelt.

Zitat:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement pBStoerfall erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.


Wie kann ich diesen Fehler beheben?

Zur Erklärung:

Das Programm verfolgt den Zweck ein Wasserkraftwerk zu simulieren, das im Normalfall 2 laufende Pumpen haben soll, alles andere sind Störfälle.

smile

Lg
InformaTiger
 
Auf diesen Beitrag antworten »
InformaTiger RE: C# Pumpensimulation

Mittlerweile habe ich weiterprogrammiert und bin zu einem neuen Problem gekommen. Es wird so ein ähnliches wenn nicht dasselbe sein wie mit dem MediaPlayer. Ich habe wieder ein Objekt benutzt um mit Properties meiner Form Daten zu übergeben leider haut auch das hier nicht hin. Leider habe ich keine Ahnung wie das wircklich richtig funktioniert.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
// In meiner Hauptform mit Properties & anderm Inhalt

[...]

bool[] aPumpen = new bool[3];
string[] aPumpentypen = new string[3];
int[] aPumpendrehzahl = new int[3];

public Main()
{
            InitializeComponent();
            aPumpentypen[0] = "Radialpumpe";
            aPumpentypen[1] = "Radialpumpe";
            aPumpentypen[2] = "Radialpumpe";
            aPumpendrehzahl[0] = 30;
            aPumpendrehzahl[1] = 30;
            aPumpendrehzahl[2] = 30;
            /*Thread t = new Thread(new ThreadStart(this.Laufzeitueberpruefung));
            t.Start();*/
}


         public string[] PUMPENTYPEN
          {
              get
              {
                  return aPumpentypen;
              }
              set
              {
                  aPumpentypen = value;
              }
          }

            public int[] PUMPENDREHZAHL
          {
              get
              {
                  return aPumpendrehzahl;
              }
              set
              {
                  aPumpendrehzahl = value;
              }
          }
[...]

//Plus hier die Stümperhafte Methode zu überprüfen ob die andere Form schon geschlossen ist

private void btnPumpentypAendern_Click(object sender, EventArgs e)
{
            FormTypAendern aAnzeigeObjekt = new FormTypAendern();
            aAnzeigeObjekt.Show();

            while (aAnzeigeObjekt.Visible)
            {
                Application.DoEvents();
                Thread.Sleep(1000);
            }

            lblTypPumpe1.Text = aPumpentypen[0];
            lblTypPumpe2.Text = aPumpentypen[1];
            lblTypPumpe3.Text = aPumpentypen[2];
            btnEinPumpe1_Click(sender, e);
            btnEinPumpe2_Click(sender, e);
            btnEinPumpe3_Click(sender, e);
        }
}
Auf diesen Beitrag antworten »
Airblader

Du kannst dir zum Beispiel mal das hier durchlesen. Im Übrigen ist es allgemein eine gute Idee, bei Fehlern erstmal eine Suchmaschine deiner Wahl zu bemühen – die meisten Fragen lassen sich dadurch gut klären und du lernst nebenbei, Probleme auch eigenständig zu lösen. Augenzwinkern

Noch etwas anderes: Du hast hier eine enorme Code-Duplikation, die du viel einfacher haben kannst:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
if ((!aPumpen[0] && aPumpen[1] && aPumpen[2]) 
    || (aPumpen[0] && !aPumpen[1] && aPumpen[2]) 
    || (aPumpen[0] && aPumpen[1] && !aPumpen[2])) {
    this.pBNormalfall.Visible = true;
    this.pBStoerfall.Visible = false;
} else {
    this.pBNormalfall.Visible = false;
    this.pBStoerfall.Visible = true;
}


Oder sogar noch besser:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
private void ... {
    ....

    boolean normalfall = ((!aPumpen[0] && aPumpen[1] && aPumpen[2]) 
        || (aPumpen[0] && !aPumpen[1] && aPumpen[2]) 
        || (aPumpen[0] && aPumpen[1] && !aPumpen[2]));
    setzeStatus(normalfall);

    ....
}

private void setzeStatus(boolean normalfall) {
    this.pBNormalfall.Visible = normalfall;
    this.pBStoerfall.Visible = !normalfall;
}


Man kann's sogar noch besser machen, aber man muss es ja nun nicht gleich übertreiben. Augenzwinkern
Auf diesen Beitrag antworten »
InformaTiger

Danke smile

I weiß, mein Programmierstil ist alles andere als super, aber ich muss zum Teil eingestehen dass ich mich mit diesem kurzen Code also "komprimierter" Version nicht viel anfangen kann da ich Sie oft nicht verstehe...

Sry.

Lg
InformaTiger
 
Auf diesen Beitrag antworten »
Airblader

Ein guter Programmierstil soll in erster Linie auch verständlich sein – das ist aber sehr grundlegende Logik, bei der ich fast sagen würde: Nutze es als Chance, es dir anzugewöhnen. Kann schon sein, dass man sich da anfangs etwas reindenken muss, aber das wird schneller als du denkst zum A und O. smile
Auf diesen Beitrag antworten »
InformaTiger

Ich denke du hast recht, es ist zwar schwer aber wenn ich mal ordentlich drin bin ist es einfach besser.

Weißt du zufällig auch wie ich mit den Objekten/Properties umgehen muss?

PS: Schade, dass du die Signatur geändert hast.

Lg
InformaTiger
Auf diesen Beitrag antworten »
Airblader

Bei der neuen Frage lasse ich Karlito oder co mal lieber den Vortritt. Augenzwinkern

Zitat:
Original von InformaTiger
PS: Schade, dass du die Signatur geändert hast.


Die neue ist doch auch super! Augenzwinkern
Auf diesen Beitrag antworten »
eulerscheZahl

Mal zum Übergeben von Daten zwischen verschiedenen Forms:
Wir haben Form1 mit einer TextBox und einem Button:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult;
            Form2 form2 = new Form2();
            dialogResult = form2.ShowDialog();
            if (dialogResult == DialogResult.OK)
            {
                textBoxForm1.Text = form2.text;
            }
        }
    }

und Form2 mit ebenfalls TextBox und Button:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private string textboxForm2Text;

        public string text
        {
            get { return this.textboxForm2Text; }
        }

        private void buttonForm2OK_Click(object sender, EventArgs e)
        { //DialogResult für diesen Button auf OK setzen bei den Properties
            this.textboxForm2Text = this.textBoxForm2.Text;
        }
    }

Wenn du nun in Form1 auf den Button klickst, öffnet sich Form2.
Dort kannst du einen Text in die TextBox tippen. Beim Klicken auf den Button von Form2 verschwindet das Fenster und der Text wird in die TextBox von Form1 übernommen.
Hilft dir das weiter?
Auf diesen Beitrag antworten »
InformaTiger

Hab ich noch nicht ganz gepeilt...

Was du da machst ist mir nicht ganz klar, wieso weiß das DialogResult wann der OK Button geklickt wird... Ist das nicht nur bei vordefinierten OK Buttons in bspw. MessageBoxen so?

Lg
InformaTiger
Auf diesen Beitrag antworten »
eulerscheZahl

Deshalb musst du dem DialogResult ja mitteilen, was das OK ist.
Klicke dazu in Form2 auf den Button, suche bei den Eigenschaften den Wert "DialogResult" und setze ihn auf OK.
Auf diesen Beitrag antworten »
InformaTiger

Kannst du mir noch mal ganz kurz Schritt für Schritt erklären was du gemacht hast?

Ich steh grad völlig auf der Leitung...

Edit: du hast ja gesagt, dass eben wenn ich ein neues Objekt erstelle das nichts von meiner Form weiß... Wie weiß dann in diesem Fall die eine Form von der anderen...

unglücklich

Lg
InformaTiger
Auf diesen Beitrag antworten »
eulerscheZahl

Ok:
Ich habe ein Projekt angelegt (Windows-Forms Anwendung).
Im bereits geöffneten Form1 habe ich Button und TextBox eingefügt, dem Button ein Click-Event geschrieben.
Dann habe ich ein 2. Form erstellt, ebenfalls mit Button und TextBox.
Bei Button 2 DialogResult auf OK stellen.

Der Buttonklick in Form1 bewirkt, dass Form2 geöffnet wird mit dialogResult = form2.ShowDialog();
dialogResult wartet dann auf eine Antwort von Form2 (=buttonForm2OK_Click)
Nun wird über public string text auf den Inhalt von textboxForm2 zugegriffen und das Ergebnis in die Textbox von Form1 eingefügt.
Auf diesen Beitrag antworten »
InformaTiger

Ich glaube solangsam verstehe ich...

großes Grinsen

PS: Ich versuchs mal und dann melde ich mich. Danke Danke Danke.

Gott

Edit: Freude Tanzen Freude Tanzen Freude Tanzen ! Hurra, es geht. Danke, eulersche Zahl.

Lg
InformaTiger
 
Neue Frage »
Antworten »


Verwandte Themen