![]() |
[visual basic] Programma uitvoeren tijdens een oneindige loop
Hoi,
Ik ben bezig met het programmeren van een robot die een aantal handelingen verricht. Nu ben ik al een heel eind, alleen ben ik op het volgende probleem gestuit. Er zijn 8 herkenningspunt voor een schijfje en de robot brengt het schijfje naar 1 van deze punten. De punten worden constant geloopt zodat je ziet als er een schijfje voor zit. Echter op het moment dat de robot het schijfje verplaats, stopt de loop. Dus als het stuurprogramma voor de robot wordt opgeroepen gaat hij uit de loop. Het is geen optie om het stuurprogramma binnen de herkenningsloop te zetten, omdat de loop dan te lang wordt en te traag voor 'continue' oplettenheid. Iemand een oplossing? |
kun je het probleem wat beter uitleggen? :o
|
Ja, doe even wat pseudocode ofzo.
|
Ik volg het ook niet helemaal, maar zoals ik het begrijp kun je het beste gebruik maken van 2 threads:
de een voert die controle uit en de ander het stuurprogramma edit: een thread maak je natuurlijk met de CreateThread api |
edit:
wat fosje zei Code:
Declare Function CreateThread Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As LongCode:
hThread = CreateThread (0, 0, AddressOf jouwFunctie, 0)dan heb je standaard stack size geen security attributen en een parameter die op 0 staat. Je kan die structures ook invullen, de structures kun je vinden op MSDN Code:
TerminateThread hThread, 0en een thread is gewoon een blok code dat parralell draait met de rest van je code in je programma |
Citaat:
|
Citaat:
|
CreateThread is leuk en aardig; maar als dit een opdracht voor school is oid. denk ik niet dat dat de bedoeling is.
Als ik het goed begrijp heb je een loop in een loop. Om het op te lossen moet je dus simpelweg een van de twee loops verwijderen. Denk aan een 3D shooter; daar hebben alle wezens ook geen loops zoals jij ze gemaakt hebben; dan zou 't hele spel niet lopen. En die maken zeker ook geen gebruik van meerdere threads; dit omdat meerdere threads maken in een spel of programma moeilijker is dan je denkt. Je krijgt namelijk te maken met syncrone processen die misschien per ongeluk aan elkaars data gaan rommelen en elkaar om zeep helpen. Wat je moet proberen is 1 loop te maken en alles te baseren op die loop. Je kan bv. wel meerdere counters mee laten lopen die hoger worden aan hand van de loop. Code:
DoIig. probeer meerdere threads te vermijden; tenzij je dondersgoed weet wat ze doen en hoe je je data beheert, levert het je alleen maar meer bugs op en tevens ook meer hoofdpijn tijdens debuggen. |
Zoals velen boven mij snappen we de probleemstelling niet echt.
En multithreaden, dat is volgens mij hier niet nodig, aangezien herkenning altijd vereist is voordat het stuurprogramma uitgevoerd wordt. Het verloopt dus sequentieel, en niet paralel. Wat jij zoekt is denk ik een infiniteloop, met daarbinnen een lus voor het herkennen en evt een lus voor het stuurprogramma. Zoiets als: Code:
while(!quit) |
Citaat:
|
Citaat:
De eerste lus hoort gewoon door te blijven itereren tot quit true is. De eerste nested lus hoort te stoppen wanneer de guard false wordt, en dus wanneer er iets binnen die lus herkend is. Dan hoort er gelust te worden op de 2e nested lus niveau tot heeftUitgevoerd true is en de guard dus false wordt. En dan worden de guards allebei weer gereset en moet het grapje weer opnieuw beginnen. Then again, de probleemstelling vind ik nog te vaag waardoor het bij gissen blijft. |
Ik zal het ff wat duidelijker uitleggen.
We hebben een vier op een rij spel en we laten de computer via een algoritme een zet berekenen. Deze zet wordt omgerekend naar de kolom waarin de steen gegooid moet worden. Aan de bovenste rij van het bord hangen 8 lichtgevoelige dioden. Deze registreren waar een steen wordt gegooid en dit wordt vervolgens in het programma als zet gebruikt. Voor deze herkenning is de volgende loop gebruikt: Code:
Do Onderaan de berekening staat het commando: Robot_aanroepen. Deze maakt vervolgens verbinding met de robot en voert de route die bij de waarde uit txtZ hoort uit. Probleem Hij stopt met de lus voor het waarnemen van de stenen, op het moment dat je de robot aanroept, en weet hij dus niet dat hij zelf heeft gegooid. Verder heb ik het commando Thread nog nooit gezien en geen idee hoe het werkt. |
Wat ik trouwens zelf had bedacht, maar ik weet niet hoe ik het kan uitvoeren:
Het programma werkt gewoon als je de handeling van de robot weglaat. Dus als jij voor de computer de steen erin gooit in de door hem opgegeven kolom. Is het dan mogelijk om een nieuw project die waarde te laten ontvangen en de robothandeling te laten doen? |
Allereerst even optimaliseren:
Code:
Do Code:
DoWat betreft je 'nieuwe idee', dan ben je aan het multithreaden, i.e. 2 processen respectievelijk in dit geval 2 threads maken dan gebruik van dezelfde resource. Wat doet insertdisk trouwens? Is dat een subroutine call? |
Wat staat er precies in de subroutine Robot_aanroepen ?
|
Citaat:
Citaat:
Citaat:
PS: Wat is ADCONV? |
Citaat:
|
Citaat:
-neemt extra veel ruimte in -comminucatie kan een probleem zijn en comminuceren dmv window messages kun je ook vergeten watn met vb kun je geen window messages lezen (WM_USER met eigen parameters bijvoorbeeld). je kan ze wel sturen btw en met thread heb je geen last van foute waardenals je met 1 thread allen een bepaalde variable leest en met de andere allen maar schrijft. en als dit wel meot kun je emt createsingleobject api gewoon een mutex aanmaken gr, Bram |
Citaat:
|
Citaat:
|
Citaat:
Ik heb het probleem trouwens opgelost. Het was niet mogelijk om het stuurprogramma van de robot en de herkennisloop naast elkaar te runnen, omdat zij allebei een loop bevatten. Daarom schakelt het herkenningsprogramma uit na het moment dat de speler een zet doet. Bedankt voor de hulp allen :) |
| Alle tijden zijn GMT +1. Het is nu 11:55. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.