Entwickler-Ecke

Sonstiges (Delphi) - Ampelsystem mit while schleife programmieren ? wie geht das


Hacker1 - Mi 21.06.06 14:24
Titel: Ampelsystem mit while schleife programmieren ? wie geht das
Hi leute ich brauche mal eure hilfe, ich habe ein ampelprojekt das ich nur mit der while funktion programmieren muss d Beschreibung unten



1. die Ampel soll durch Drücken eines Buttons in die nächste Phase schalten

2. es darf kein Timer verwendet werden

3. ich muss das ganze in einer Warteschleife schreiben.



Das bedeutet: 1. Innere Schleife mit "Delay"

2. Phasen - Schleife

3. Repeat "Taste"

also insgesamt 3 Schleifen. die ineinander geschachtelt sind.

Ich musste am Anfang mit einem fertig bearbeitetem Programm rausfinden, bei welcher Bit Nr. die Ampel in die entsprechenden farben umschalten kann.

Das Schema schreibe ich euch kurz einmal auf:

Es soll in 8 Phasen ablaufen. Ich habe eine Platte mit einem Ampelsystem an den PC angeschlossen darauf ist auch ein Knopf.

Die Ampel ist am Anfang aus. Sobald ich auf den Knopf (von der Platte) drücke wird die Ampel des Fußgängers rot und die Autoampel grün. dies soll 5 sek. dauern. Danach ist die Fußgängerampel immer noch rot und die Autoampel gelb. Nach 2 Sek. wird dann die Autoampel auf rot umgeschalten und die Fußg.ampel ist immer noch auf rot. Nach 5 sek. wird dann die Fußgängerampel grün,dies dauert 10 sek. Danach schaltet die ampel wieder auf rot, dabei stehen 2 sekunden lang alle ampeln auf rot. Bis dann die Autoampel auf gelb umschaltet, dies dauert ebenfalls 2 sek. Darauf wird dann die Autoampel wieder grün. Dabei ist die Fußgängerampel natürlich auf rot. Nach der ganzen Sache fängt das ganze wieder von vorne an.

???


Jakob Schöttl - Mi 21.06.06 14:34

Mit application.ProcessMessage; kannst du die Schleife kurz unterbrechen, und eine ereignisbehandlungsroutine von dem ampelschalter auführen lassen. darin kann z.B. eine globale variable AmpelSchalterWurdeGedrueckt := True;. Darauf kannst du dann in der schleife reagieren, denn diese wird nach der ereignisbehandlungsroutine fortgesetzt werden: if AmpelSchalterWurdeGedrueckt then NaechstePhase;


Hacker1 - Mi 21.06.06 19:10

das war jetzt net so klar


Hacker1 - Do 22.06.06 11:17

kann mir niemand helfen :-(


freak4fun - Do 22.06.06 13:54

Darf man Fragen warum ohne Timer?

Du könntest dir einen Timestamp holen und dann in der While-Schleife prüfen, ob die Zeit (2, 5 Sekunden) um ist und dann den Status der Ampeln abfragen, um zu sehen, welche Phase als nächstes kommt. Finde ich allerdings unschön.

PS: Doppelt hält besser. ;)

MfG
freak


Hacker1 - Do 22.06.06 14:48

weil alles in der while schleife erledigt werden muss


Jakob Schöttl - Do 22.06.06 15:14

Schade, dass du es noch nicht verstanden hast.


Delphi-Quelltext
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:
var AmpelWurdeGedrueckt,Beenden: Boolean;

//OnShow:

begin
  While not Beenden do begin
    Autoampel.Color := clgreen;
    Fussgaengerampel.Color := clred;
    Application.ProcessMessage;
    if AmpelWurdeGedrueckt then begin
      //Hier musst du halt noch schleifen einbauen, oder so in der art:
      AutoAmpel.Color := clyellow;
      Sleep(2000);
      AutoAmpel.Color := clred;
      Sleep(1000);
      Fussgaengerampel.Color := clgreen;
      //...
    end;
  end;
end;


//OnCloseQuery:
begin
  Beenden := True;
end;

//OnButton1Click:
begin
  AmpelWurdeGedrueckt := True;
end;


freak4fun - Do 22.06.06 16:32

Heiß aber auch, das die Anwedung nicht sofort reagiert, wenn man Beeneden drückt. Ich denke es gibt da noch bessere Lösungen. Diese mag zwar laufen aber ... Leider kann ich keine Bessere anbieten. :( Aber er holt sich ja auch noch anderswo Hilfe. ;)

MfG
freak


Jakob Schöttl - Do 22.06.06 16:49

Aber wenn er es nur in Schleifen machen darf, ohne Timer? Fällt dir was anderes ein


Hacker1 - So 25.06.06 22:31

Helft mir bitte ich hab kein plan :-(


Narses - Mo 26.06.06 00:10

Moin!

Wir sollen dir helfen, aber der Thread ist im Status "gelöst"? :gruebel: Wat denn nu? ;)

OK, hast du denn schon ein Zustandsdiagramm/Tabelle für deine Ampelanlage gemacht? Wenn nicht, dann halte ich das für den ersten Schritt. Schreib dir in einer Tabelle auf, was genau passieren soll (Zeilen: Zustände; Spalten: die einzelnen Ampeln und die Zeit, für die der Zustand gültig ist).

Wenn du das fertig hast, dann stell das mal hier rein, damit kommen wir dann weiter.

cu
Narses