[VB6]liftsimulatie met parallelle timers

Pagina: 1
Acties:

  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
Ik ben bezig met het schrijven van een liftsimulatie-programma voor een gebouw van 30 verdiepingen en 1 lift.
Hiervoor schrijf ik een optimalisatie "route" voor de lift, zodat de mensen op de verschillende verdiepingen zo kort mogelijk hoeven te wachten.
Deze optimalisatie route wordt gesimuleerd bij een bepaalde snelheid van toevoeging van mensen die van de lift gebruik willen maken.
Per tijdsinterval worden op random verdiepingen mensen geplaatst met een random destination, met behulp van een timer.
De lift wordt hierbij visueel als animatie weergegeven.

Voor het runnen van de simulatie kunnen variabelen zoals :

max liftcapaciteit
interval tussen het toevoegen van nieuwe wachtende mensen (sec)
snelheid lift
verdieping gebruik

ingevoerd worden.
Hierna wordt op de knop run simulatie gedrukt en wordt de simulatie uitgevoerd.

Mijn probleem is het volgende:
Bij het runnen van de simulatie voegt het programma per tijdsinterval op een random verdieping een wachtende persoon toe.
Op het moment dat de eerste persoon in "wacht" is geplaatst op verdieping "X" met destination "Y" gaat de lift zijn optimalisatie runnen.
(visueel gaat de lift naar verdieping "X" , weergegeven in een picturebox, met behulp van een timer die iedere 0.01 sec een nieuwe lift positie tekent until de lift op verdieping "X" komt.)

Nu moet de random personen toevoeger per tijdsinterval personen blijven toevoegen op random verdiepingen.
Echter gedurende de animatie "verplaatsing lift naar verdieping X" stopt de random personen generator.
Als de lift op zijn destination is aangekomen, vervolgt het random personen proces zich pas weer :( .

Dit onstaat door :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for persoontoevoeging = 0 to aantalpersonen

    timer1 met tijdsinterval (t)
    voeg persoon op random verdieping toe

    do while verdieping < destination

        timer2 met klein tijdsinterval waarvoor image lift wordt getekend
        current position = currentposition + 0.1

    loop

next persoonstoevoeging


Buiten de for plaatsen van de lift image code levert eerst de gehele personentoevoeging op, waarna de lift naar de laatst ingevoerde wachtende gaat :(.

Hoe kan ik deze 2 timers nu parallel laten werken??
Ik heb het complete handboek vb6 van Que (brian siler en jeff spotts), maar kan hier niks vinden over parallel gebruik van timers :'( .

[ Voor 3% gewijzigd door chrisstructor op 11-11-2004 19:47 ]

There are 10 types of people in this world, those who understand binary and those who don't


  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 08:29

Super_ik

haklust!

gewoon een timer toevoegen :?

de 1e timer zorgt voor de lift animatie
en de 2e timer voor de random mensen toevoegen

[ Voor 62% gewijzigd door Super_ik op 11-11-2004 19:44 ]

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


  • Microkid
  • Registratie: Augustus 2000
  • Laatst online: 13:17

Microkid

Frontpage Admin / Moderator PW/VA

Smile

Je moet volgens mij gewoon 1 timer gebruiken, en dan steeds per seconde je acties uitvoeren. Dat kan zijn op een random verdieping een persoon toevoegen, of de lift verplaatsen, of andere acties. In het echt heb je ook maar 1 tijd, dus in een simulatie ook. Zo heb ik het iig ook ooit gedaan voor een kapperszaak (schoolvoorbeeld van een simulatie programma ;) ). Werkt prima.

4800Wp zonnestroom met Enphase
Life's a waste of time. Time's a waste of life. Get wasted all the time and you'll have the time of your life.


  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
Hmmmmmm, je bedoelt dus:

timer met tijds-stap (bijvoorbeeld) 0.01
deze timer continu laten lopen
en voor toevoegen van personen : (bijvoorbeeld) per 5 sec 1 persoon
en de lift animatie laten lopen per timer stap.

Ofwel :
beide "gebeurtenissen" maken gebruik van dezelfde timer.

Zal ik eens gaan proberen ;) .
Bedankt alvast

There are 10 types of people in this world, those who understand binary and those who don't


  • Microkid
  • Registratie: Augustus 2000
  • Laatst online: 13:17

Microkid

Frontpage Admin / Moderator PW/VA

Smile

Ja, alleen zou ik de personen toevoegen op een random wijze, en niet per 5 sec 1 persoon. Zo gaat het in het echt tenslotte ook niet. Personen komen willekeurig op willekeurige verdiepingen bij de lift, en gaan naar een willekeurige verdieping.

In pseude code iets van:
code:
1
2
3
4
5
timer=0
if random(100) < 10 then add person
move lift
timer=timer+1
loop

en add person kan iets zijn van:
code:
1
2
begin_verdieping = random(30)
eindverdieping = random(3)

4800Wp zonnestroom met Enphase
Life's a waste of time. Time's a waste of life. Get wasted all the time and you'll have the time of your life.


  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
code:
1
2
3
4
5
6
do
    timer=0
    if random(100) < 10 then add person
    move lift
    timer=timer+1
loop


AAAAAAaaaaa, ik snap denk ik wat je bedoelt :9 .

1 complete simulatie-loop loopt in een timer tijdinterval stap.
(die ik wel wat kleiner neem als 1 sec :) )
Dat is toch wat je bedoelt?

Zo kan ik inderdaad te werk gaan.
Ik ga dit uitwerken.

Heel erg bedankt voor dit simpele doch geniale nieuwe perspectief op VB ;) .

[ Voor 26% gewijzigd door chrisstructor op 11-11-2004 21:30 ]

There are 10 types of people in this world, those who understand binary and those who don't


Verwijderd

kijk hier eens, voor een tutje over asynchroon proggen in VB6

  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
Nog wel een vraag......

Wat ik nu wil doen is :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
timer.interval = 10  (0.01 sec)
timer.enabled = true

do
    timer = 0
    if timer = veelvoud van 1 sec then
        voeg persoon toe aan random verdieping
    end if

    if persoon in wacht op verdieping X then
        move lift picture to verdieping X
    end if
    'iedere loop van 0.01 sec nieuwe image, waardoor animatie van lift

    timer = timer + timer.interval

loop

Hoe creer ik het stukje "veelvoud van 1 sec" dan?
En benader ik het probleem nu op de correcte manier?

[ Voor 3% gewijzigd door chrisstructor op 11-11-2004 22:07 ]

There are 10 types of people in this world, those who understand binary and those who don't


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
chrisstructor schreef op 11 november 2004 @ 22:06:
Hoe creer ik het stukje "veelvoud van 1 sec" dan?
En benader ik het probleem nu op de correcte manier?
Dit kan je doen door het volgende te doen:
Visual Basic:
1
2
3
if timer mod 1000 = 0 then
  ' dit is een hele seconde
end if

weet wel dat niet niet helemaal goed is.. doordat de code soms langer/korter draait kan het zijn dat je niet precies op de seconde uitkomt (voor langere tijd) waardoor het stukje code niet wordt uitgevoerd.

offtopic:
wordt er nu 1 persoon per random beurt toegevoegd of meerdere?
In het echte leven kan het namelijk ook zijn dat er tegelijk 5 mensen bij de lift komen te staan (denk aan een familie). Deze zullen ook tegelijk de lift in willen en niet eerst 4 en dan 1 (bijvoorbeeld). Misschien een leuke uitdaging als de rest al werkt :)

[ Voor 45% gewijzigd door DukeMan op 12-11-2004 12:32 ]


  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
Klopt, als ik het geheel helemaal werkend heb , ga ik dit soort toevoegingen doen.

Het schrijven van de lift optimalisatie wordt het grootste probleem "to tackle" ;) .
In ieder geval bedankt voor de replies :> .

There are 10 types of people in this world, those who understand binary and those who don't


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 11:09
Leuk projecte overigens! Is dat voor je opleiding? En ga je het programma ook uitbreiden met meerdere liften? Want dat is pas echt interessant :).

  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
* GigaDave56 zoekt even in het verleden naar zijn laatste poging een spelletje te maken in qBasic.

Is deze opzet niet iets voor je:

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
Do
    Do
        Call Move_Elevator_To_Destination()
            // Klein stukje animatie van lift 

        Call Check_For_Arrival()
            // Is de lift op zijn bestemming

        Call Check_For_New_Person_Waiting()
            // Is er (random) iemand bijgekomen die op de lift wacht?

    While (Not_Arrived_@_Destination)
    // De lift is nog niet op zijn bestemming, dus ga door met 'liften'


    If (New_Person_Waiting) Then
        Call Optimize_Elevator_Usage()
        // Er moet geoptimaliseerd worden
    Else
        Pause_Elevator
        // Of ga naar de verdieping waar je het eerst iemand verwacht :)
    End if

Loop


Ik moet hierbij zeggen dat deze opzet wel al wat gedateerd is. Vroeger :P werkten spelletjes in qBasic (Gorilla's en andere) veelal op deze manier, omdat er geen call-backs en etc waren.

De functies Move_Elevator_To_Destination(), Check_For_Arrival() & Check_For_New_Person_Waiting() kan je in een timer zetten. De snelheid van de lift regel je dan via de functie Move_Elevator_To_Destination() en die laat je afhangen van het interval van de timer. (Bij een gelijke liftsnelheid, zal bij een klein interval de lift sneller bewegen) Ditzelfde geldt voor de functie die voor de random wachtende mensen zorgt.

[ Voor 2% gewijzigd door GigaDave56 op 12-11-2004 14:23 . Reden: typo's ]

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • chrisstructor
  • Registratie: Juni 2001
  • Laatst online: 01-02-2020

chrisstructor

Employ your more evil being

Topicstarter
Sorry dat ik een tijd niet in het topic gekeken heb ;) .
Het was inderdaad voor mijn opleiding.
Heb de simulatie geschreven in Delphi en werkt nu naar behoren.
Wel interessant om te zien dat zo'n simulatie geheel in de soep loopt qua "doorspoeling" van mensen bij invoering van waardes vergelijkbaar met het Empire State Building :P .
(Wat ook heel normaal is met 1 lift :Y) )

[ Voor 13% gewijzigd door chrisstructor op 16-04-2005 00:43 ]

There are 10 types of people in this world, those who understand binary and those who don't


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 11:09
30 verdiepingen en 1 lift, tja dat is wettelijk niet eens toegestaan denk ik ;).

Verwijderd

Met het toevoegen van een tweede lift ben je er nog niet. Zolang je niet extra intelligentie inbouwt, zul je zien dat de twee liften elkaar na verloop van tijd gaan volgen en de extra capaciteit niet optimaal benut wordt. Het leuke is dat juist de simpelste oplossingen (bijv. één simpele stelregel) het beste werken. Succes ermee!
Pagina: 1