C# Pumpensimulation |
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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.
Lg
InformaTiger
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2013 16:33 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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);
}
} |
|
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2013 18:16 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
|
|
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.
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.
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
10.05.2013 18:18 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
Danke
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
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2013 18:26 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
|
|
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.
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
10.05.2013 18:34 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2013 18:37 |
|
|
Airblader
Doppel-As
Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München
|
|
Bei der neuen Frage lasse ich Karlito oder co mal lieber den Vortritt.
Zitat: |
Original von InformaTiger
PS: Schade, dass du die Signatur geändert hast. |
Die neue ist doch auch super!
__________________ The best thing about a boolean is that even if you're wrong, you're only off by a bit.
|
|
10.05.2013 18:51 |
|
|
|
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?
__________________ Syntax Highlighting fürs Board (Link)
|
|
10.05.2013 19:28 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
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
__________________ Why do Java developers wear glasses? Because they can't C#
|
|
10.05.2013 19:42 |
|
|
|
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.
__________________ Syntax Highlighting fürs Board (Link)
|
|
10.05.2013 19:44 |
|
|
InformaTiger
Tripel-As
Dabei seit: 19.02.2013
Beiträge: 228
Herkunft: Südtirol
|
|
|
10.05.2013 20:06 |
|
|
|