Vollständige Version anzeigen : [C#] Ampelsteuerung


cable
16.02.2011, 14:46

Hoi,

ein User fragte mich hier, ob ich ihm eine Ampel programmieren könne mit C#. Nachdem ich erfahren habe, was es können soll habe ich mich dran gegeben. Ist eigentlich nichts besonderes, aber was hier für einige interessant sein kann ist, dass es einen automatischen Ablauf der Ampel im neuen Thread gibt und eine Aktualisierung der GUI. Zudem habe ich die Bilder in die Ressourcen gepackt. Ich zeige als auch, wie ich die Bilder wechsle.

Die Ampel Klasse:
namespace pAmpel
{
class cAmpel
{
private AmpelZustand zustand;

public cAmpel()
{
zustand = AmpelZustand;Stop;
}

public AmpelZustand Zustand
{
get { return zustand; }
set { zustand = value; }
}

public void schalteNaechsten() {
switch (zustand)
{
case AmpelZustand;Stop:
zustand = AmpelZustand;Ready;
break;
case AmpelZustand;Ready:
zustand = AmpelZustand;Go;
break;
case AmpelZustand;Go:
zustand = AmpelZustand;Brake;
break;
case AmpelZustand;Brake:
zustand = AmpelZustand;Stop;
break;
}
}

public void Durchlauf(object data)
{
for (int i = 0; i < 4; i++)
{
System;Threading;Thread;Sleep((int)data);
schalteNaechsten();
}
}

}

enum AmpelZustand {
Stop,
Ready,
Brake,
Go
}
}


Die Funktion, mit der die Ampel gestartet wird (der komplette Durchlauf):
private void bDurchlauf_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ParameterizedThreadStart(ampel;Durchlauf));
int waitTime;
try
{
waitTime = Convert;ToInt32(tBTimeForState;Text);
}
catch (Exception)
{
//default: 2 sec for each state
waitTime = 2000;
}
t;Start((object)waitTime);

do
{
changeColor();
this;Update();
} while (t;IsAlive);

//to ensure that the colors will change after the thread finished
changeColor();
}


Die Funktion, mit der ich auf die Resourcen zugreife und die Bilder wechsle:
private void changeColor()
{
switch (ampel;Zustand)
{
case AmpelZustand;Stop:
pBRed;Image = Resources;red_active;
pBYellow;Image = Resources;yellow_passive;
pBGreen;Image = Resources;green_passive;
break;
case AmpelZustand;Ready:
pBRed;Image = Resources;red_active;
pBYellow;Image = Resources;yellow_active;
pBGreen;Image = Resources;green_passive;
break;
case AmpelZustand;Go:
pBRed;Image = Resources;red_passive;
pBYellow;Image = Resources;yellow_passive;
pBGreen;Image = Resources;green_active;
break;
case AmpelZustand;Brake:
pBRed;Image = Resources;red_passive;
pBYellow;Image = Resources;yellow_active;
pBGreen;Image = Resources;green_passive;
break;
}


Zum Schluss noch das ganze Projekt:
Download: pAmpel;rar | ;;xup~in (;;;xup~in/dl,10270282/pAmpel;rar/)

Habe die Binaries rausgelassen, aber selbst kompilieren sollte mit einem Knopfdrücken klappen ;)

greeez

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Chillikid
16.02.2011, 17:09

Wieso hast du
public void Durchlauf(object data)
und nicht
public void Durchlauf(int waittime)
genutzt? Du castest doch sowieso wieder nach int.


cable
16.02.2011, 17:51

Das ist eine gute Frage. Das musste ich tun, da new ParameterizedThreadStart() als Parameter einen Delegat haben wollte, der als Parameter ein Objekt haben will. Deshalb musste ich in Durchlauf als Parameter ein Objekt vom Typ object nehmen, sonst hätte es vor der Kompilierung schon Probleme gegeben. Versuch es mal und du wirst sehen, dass es nicht funktioniert. Der Vorteil ist, dass man eigene Strukturen und sowas also Object übergeben kann (beispielsweise ein Array), in dem dann alle benötigten Parameter vorkommen. (Man übergibt weiterhin aber nur ein Object).

greez

edit: ParameterizedThreadStart-Delegat (System;Threading) (;msdn;microsoft~com/de-de/library/system;threading;parameterizedthreadstart(v=vs;80);aspx)


Chillikid
16.02.2011, 18:05

Okay stimmt, aber elegant finde ich das nicht unbedingt. Ich benutze dafür lieber Lambda-Expressions:

private void bDurchlauf_Click(object sender, EventArgs e)
{
int waitTime;
try
{
waitTime = Convert;ToInt32(tBTimeForState;Text);
}
catch (Exception)
{
//default: 2 sec for each state
waitTime = 2000;
}

Thread t = new Thread(() => ampel;Durchlauf(waitTime));
t;Start();

do
{
changeColor();
this;Update();
} while (t;IsAlive);

//to ensure that the colors will change after the thread finished
changeColor();
}


Dann kann man die Methode Durchlauf auch mit einem int-Argument schreiben.


cable
16.02.2011, 18:15

Ich denke, dass das Haarspalterei ist und Lambda Ausdrücke für viele, die was lernen möchten und gerade erst anfangen, doch recht schwer sind. Daher hab ich die übliche Methode genommen und meiner Meinung nach lässt die sich auch ein wenig besser nachvollziehen ;)

(aber du hast Recht, mit deiner Methoed kann man auch wieder einen int als Parameter Typ nehmen)

greez


Chillikid
16.02.2011, 18:26

Ich denke, dass das Haarspalterei ist und Lambda Ausdrücke für viele, die was lernen möchten und gerade erst anfangen, doch recht schwer sind. Daher hab ich die übliche Methode genommen und meiner Meinung nach lässt die sich auch ein wenig besser nachvollziehen ;)

Das stimmt natürlich auch wieder :]

Was ich allerdings noch ganz interessant fand, war der Zugriff auf die Resourcen. Ich habe mich damit bisher nie beschäftigt und wusste gar nicht, dass es da eine so elegante Möglichkeit für gibt. Mir war bisher nur der Zugriff über Assembly;GetManifestResourceStream bekannt. Wieder was dazugelernt :D


Ähnliche Themen zu [C#] Ampelsteuerung
  • Ampelsteuerung Digitaltechnik -- WICHTIG!!
    Hallo, ich habe schon google maltretiert, aber es will nichts brauchbares ausspucken! Ich suche einen Schaltplan, für eine Ampelsteuerung! Es soll auch lediglich eine Simulation bleiben! Am besten MIT Fußgängerampel! Noch besser wäre es, wenn Induktionsschleifen und Fußgängertaster, in de [...]

  • [Delphi] 7, Ampelsteuerung :X
    Hi all, ich mache grad mein ABI, und habe Informatik. Das Programmieren an sich finde ich noch ganz einfach. Weil wir irgendwie mit vorgefertigten Begriffen arbeiten, die die Regierung uns gegeben hat. Nun ja egal, ich wollte grad etwas rumbasteln, für die nächste Stunde schonmal etwas vorarbeit [...]



raid-rush.ws | Imprint & Contact pr