Realisierungsproblematik für Ampelsystem
-
Hallo,
ich habe bereits vor kurzem hier eine Frage gestellt bezüglich eines Programmes, in dem unter gewissen Zuständen eine bestimmte Ampelsituation dargestellt werden soll. Das ankleistern der Ampel habe ich geschafft und sieht auch super aus, nun fehlt mir jedoch eine Idde, wie ich es schaffe, dass das System auch aktuell die richtige Ampelstellung aufweist.Im System exisieren Datein. Je nachdem welchen Namen die Dateien haben, zeigt die Ampel grün, rot oder gelb.
Dieser Name muss per if Abfrage abgefragt werden. Je nachdem welcher Ampelzustand angezigt wird, werden der Form Controlelemente zugefügt, also Buttons, mit der Bezeichnung Stop, Wait und Run. Nun ist es so, dass sich die Dateien unabhängig von meinem Tool verändern und das Tool soll aber immer den aktuellen Stand angeben, wo mir die zündende Idee fehlt, wie man sowas machen kann.Ich habe mir Gedanken gemacht un einige mögliche Optionen in betracht gezogen, wobei ich nicht weiß, ob das so ratsam ist:
--- Man könnte einen Timer einrichten, der jede Sekunde diese If-Abfrage startet. Die Idee halte ich für sinnvoll, jedoch könnte die Performance wohl auch arg leiden.
--- Vielleicht ist es auch möglich über einen Timer einfach einen refresh zu machen?Das Problem ist, dass jeder Buttonklick momentan erstmal Testweise die Dateinamen ändert (zum Test einfach setzt), aber dabei wird das Ampelbild nicht neu gezeichnet.
public Form1() { //TESTZWECK ------------------------------------------------------------------------- lbControlDir.Text = v.Env.Expand("${Proj}\\temp\\testremote\\Control.running"); //----------------------------------------------------------------------------------- if (lbControlDir.Text == v.Env.Expand("${Proj}\\temp\\testremote\\Control.stopped")) { lbTestCondition.Text = v.Env.Expand("Stopped"); this.lbGraph.Paint += new System.Windows.Forms.PaintEventHandler(this.lbGraph_PaintRed); } else if (lbControlDir.Text == v.Env.Expand("${Proj}\\temp\\testremote\\Control.running")) { lbTestCondition.Text = v.Env.Expand("Running"); this.lbGraph.Paint += new System.Windows.Forms.PaintEventHandler(this.lbGraph_PaintGreen); Controls.Add(btnWait); Controls.Add(btnStop); } else if (lbControlDir.Text == v.Env.Expand("${Proj}\\temp\\testremote\\Control.waiting")) { lbTestCondition.Text = v.Env.Expand("Waiting"); this.lbGraph.Paint += new System.Windows.Forms.PaintEventHandler(this.lbGraph_PaintYellow); Controls.Add(btnRun); Controls.Add(btnStop); } }
Und die Events leiten dann auf folgende Methoden, was auch einwandfrei funkioniert:
protected void btnWait_Click(object sender, EventArgs e) { Controls.Remove(btnWait); Controls.Add(btnRun); lbTestCondition.Text = v.Env.Expand("Waiting"); lbControlDir.Text = v.Env.Expand("${Proj}\\temp\\testremote\\Control.waiting"); } protected void btnRun_Click(object sender, EventArgs e) { Controls.Remove(btnRun); Controls.Add(btnWait); lbTestCondition.Text = v.Env.Expand("Running"); lbControlDir.Text = v.Env.Expand("${Proj}\\temp\\testremote\\Control.running"); }
Und angemalt wird dann wiefolgt:
private void lbGraph_PaintRed(object sender, System.Windows.Forms.PaintEventArgs e) { SolidBrush redbrush = new SolidBrush(Color.Red); e.Graphics.FillEllipse(redbrush, new Rectangle(58, 33, 67, 67)); } private void lbGraph_PaintYellow(object sender, System.Windows.Forms.PaintEventArgs e) { SolidBrush yellowbrush = new SolidBrush(Color.Yellow); e.Graphics.FillEllipse(yellowbrush, new Rectangle(58, 123, 67, 67)); } private void lbGraph_PaintGreen(object sender, PaintEventArgs e) { SolidBrush greenbrush = new SolidBrush(Color.LawnGreen); e.Graphics.FillEllipse(greenbrush, new Rectangle(58, 212, 67, 67)); }
-
Ich habe nicht wirklich kappiert was Du erreichen willst.
Aber Veränderungen an Dateien überwacht man mit der FileSystemWatcher-Klasse
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=VS.90).aspx
-
Ich habe auch mal sone Aufgabe programmiert. Gelöst folgendermassen:
Eine 2D-Matrix speichert den Status und die Phase. Status gibt für jede Ampel den Status an je nach Index, Phase je nachdem, was die Ampeln anzeigen sollen, wird normal durchiteriert. Für jede Phase bekommt also jede Ampel den Status vorgegeben.
Der Timer wird auch entsprechend der Phasen auf die jeweilige Dauer gestellt und mit jedem Tick wird dann die Phase weitergeschaltet.Ich habe jetzt nicht genau verstanden, wo dein Problem liegt, aber vielleicht hilft dir ja mein Ansatz.
grüße tobi
-
@TobiBob: Nein, das hilft leider nicht, weil die dateien ändern sich wie gesagt unabhängig vom Tool und demnach soll kein Timer verwendet werden, der nach Ablauf die Ampel weiterschaltet, sondern der Ameplzustand soll quasi auf eine externes Verhalten überprüfen, mit der Zusatzoption per entsprechenden Buttons, auf dieses externe Ereigniss möglicherweise Einfluss zu haben.
@µ: Das klingt auf jeden Fall schonmal super und dürfte mein Problem beheben, da ich nach dem Einlesen in den Link das auch so verstanden habe, dass die Überprüfung zeitnah erfolgt, da sie bei jeder Dateiänderung ein Ereignis auslöst. Also was effektiveres dürfte es wohl kaum geben für mein Problem, vielen Dank