Autor Beitrag
nitrovic
Hält's aus hier
Beiträge: 4

WIN 2000
D7 Enterprise
BeitragVerfasst: Do 03.03.05 18:09 
Hallo,
bin noch nicht allzu lange in delphi unterwegs, sitz aber grad an ner Facharbeit über
Staupotentiale auf Autobahnen. Hier mein Problem:

Die Bewegung jedes einzelnen Fahrzeugs wird über einen eigenen timer geregelt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        procedure TAuto.Bewegen(Sender:TObject);
        begin
          Inc(step);
          Strasse.Fahrbahnfrei[Y,X]:= -1;
          Inc(X);
          Strasse.Fahrbahnfrei[Y,X]:= autonr;
          SetzePos (X,200-10*Y);
          Application.ProcessMessages;
          If (step>10)
            Then Fahrtakter.Enabled:= False;
end;


Allerdings ist diese nur ein Teil des Betriebstaktes, der sich am Ende wieder selbst aufruft.

ausblenden 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:
procedure TAuto.Fahren;
begin
  A1:=acc1;
  A2:=acc2;
  If (A1 < A2)
    Then Begin
           Spurwechsel;
           V:= V + A2
         End
    Else V:=V + A1;
  step:=0;
  Fahrtakter.Interval:= round(1000/V);
  Fahrtakter.Enabled:= True;
end;

procedure TAuto.BetriebsTakt;
begin
  Fahren;
  If (WaitFor>-200)
    Then  If (X>725)
           Then Begin
                  Fahrtakter.Enabled:= False;
                  Strasse.Fahrbahnfrei[Y,X-laenge]:= -1;
                  Strasse.Fahrbahnfrei[Y,X]:=-1;
                  SetzePos(20,20);
                  Corpus.Visible:= False;
                End
           Else Betriebstakt;
end;


Doch es endet logischerweise ständig in einem StackOverflow, weil das Hauptprogramm nicht wartet, bis die Fortbewegung des Objekts, abgeschlossen ist. Darüber hinaus, dürfen die anderen Fahrzeuge nicht beeinflusst werden...Die von der Hilfe angebotene WaitFor-Methode konnte ich nicht entsprechend verwenden, vll aber auch nur aus mangelnder Fähigkeit.
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Fr 04.03.05 12:36 
Mach mal das Application.ProcessMessages raus und guck was passiert.
nitrovic Threadstarter
Hält's aus hier
Beiträge: 4

WIN 2000
D7 Enterprise
BeitragVerfasst: Fr 04.03.05 13:37 
leider kein erkennbarer unterschied...nach wie vor Stackoverflow.

was ich brauche is ne warte-funktion die das hauptprogramm(betriebstakt) des einzelnen fahrzeugs warten lässt, aber andere fahrzeuge(->betriebstakt) nicht beeinträchtigt.

mfg
nitro
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.03.05 13:42 
kann dir nicht wirklich helfen, aber das hört sich stark nach Threads an
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 04.03.05 13:45 
"Stackoverflow": Stinkt nach Unendlichschleife, schau dir die Prozedur BetriebsTakt genauer an. Für Schleifen musst du repeat..until benützen und möglichst auf selbstaufrufe verzichten!


Zuletzt bearbeitet von delfiphan am Fr 04.03.05 13:47, insgesamt 1-mal bearbeitet
nitrovic Threadstarter
Hält's aus hier
Beiträge: 4

WIN 2000
D7 Enterprise
BeitragVerfasst: Fr 04.03.05 13:46 
joa...hab da schon ein, zwei hinweise in der hilfe gefunden, werd' mal lieber das forum danach durchtöbern, da ich mich in unserm "glorreichen" informatikunterricht mit sowas noch nie befassen musste *lächz*...was ist der schüler ohne seinen pc?

mfg
nitro
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 04.03.05 13:50 
nitrovic hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TAuto.BetriebsTakt;
begin
  Fahren;
  If (WaitFor>-200)
    Then  If (X>725)
           Then Begin
                  Fahrtakter.Enabled:= False;
                  Strasse.Fahrbahnfrei[Y,X-laenge]:= -1;
                  Strasse.Fahrbahnfrei[Y,X]:=-1;
                  SetzePos(20,20);
                  Corpus.Visible:= False;
                End
           Else Betriebstakt;
end;

Das folgende macht genau dasselbe, ist aber viel eleganter und Stacküberläufe kriegst du auch nicht.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TAuto.BetriebsTakt; 
begin
 repeat
  Fahren;  
 until (WaitFor>-200) and (X>725);
 Fahrtakter.Enabled:= False;  
 Strasse.Fahrbahnfrei[Y,X-laenge]:= -1;  
 Strasse.Fahrbahnfrei[Y,X]:=-1;  
 SetzePos(20,20);  
 Corpus.Visible:= False;  
end;
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 04.03.05 13:52 
Oops, sorry macht nicht genau dasselbe, dafür das hier (ohne auf den Sinn der Prozedur Rücksicht zu nehmen):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TAuto.BetriebsTakt;  
begin  
 repeat
  Fahren;  
  if (WaitFor>-200) then
  begin
   if (X>725) then 
   begin  
    Fahrtakter.Enabled:= False;  
    Strasse.Fahrbahnfrei[Y,X-laenge]:= -1;  
    Strasse.Fahrbahnfrei[Y,X]:=-1;  
    SetzePos(20,20);  
    Corpus.Visible:= False;  
    break;
   end;
  end else
   break;
 until false;
end;
nitrovic Threadstarter
Hält's aus hier
Beiträge: 4

WIN 2000
D7 Enterprise
BeitragVerfasst: Fr 04.03.05 14:34 
Titel: heureka
ein lobgesang auf delfiphan...
es bewegt sich wieder. das programm ist jetzt wohl deutlich stabiler. werd mich jetzt mal wieder um die details(abstand, verkehrsregeln,etc.) kümmern.

mfg nitro