Registreer FAQ Berichten van vandaag


Ga terug   Scholieren.com forum / Technologie / Software & Hardware
Reageren
 
Topictools Zoek in deze topic
Oud 14-11-2005, 17:23
Verwijderd
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?
Met citaat reageren
Advertentie
Oud 14-11-2005, 17:56
Verwijderd
kun je het probleem wat beter uitleggen?
Met citaat reageren
Oud 14-11-2005, 18:08
Manuzhai
Avatar van Manuzhai
Manuzhai is offline
Ja, doe even wat pseudocode ofzo.
__________________
Slechts beschikbaar via naamzoek/privebericht.
Met citaat reageren
Oud 14-11-2005, 18:17
Verwijderd
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
Met citaat reageren
Oud 14-11-2005, 19:00
Warsocket
Avatar van Warsocket
Warsocket is offline
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 Long
en dan kun je met de juiste parameters CreateThread aanroepen

Code:
hThread = CreateThread (0, 0, AddressOf jouwFunctie, 0)
en dan draait jouwFunctie in een apparte thread
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, 0
en dan stopt je extra thread ermee



en een thread is gewoon een blok code dat parralell draait met de rest van je code in je programma
__________________
01110100011001010111011001100101011001010110110000100000011101000
11010010110101001100100001000000011111100111111001000000011101001010000

Laatst gewijzigd op 14-11-2005 om 19:15.
Met citaat reageren
Oud 14-11-2005, 19:04
Verwijderd
Citaat:
Warsocket schreef op 14-11-2005 @ 20:00 :
Code:
DoEvents
in je oneindige loop zetten
dan reageert je programma gewoon op zijn events
en wordt zijn loop dus te langzaam
Met citaat reageren
Oud 14-11-2005, 19:18
Warsocket
Avatar van Warsocket
Warsocket is offline
Citaat:
fosje schreef op 14-11-2005 @ 20:04 :
en wordt zijn loop dus te langzaam
heb het al verbeterd
__________________
01110100011001010111011001100101011001010110110000100000011101000
11010010110101001100100001000000011111100111111001000000011101001010000
Met citaat reageren
Oud 14-11-2005, 19:58
Marcade
Avatar van Marcade
Marcade is offline
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:
Do

Call MoveHerkenningspunt LijstMetPunten()
Call MoveBot Bot()

Loop
Waarbij de functies dus niet de handeling van A tot Z doen, maar alleen een stukje (bv 1 pixel).

Iig. 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.
Met citaat reageren
Oud 14-11-2005, 20:05
Verwijderd
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)
{
    while(!heeftIetsHerkend)
    {
        //....
    }

    while(!heeftUitgevoerd)
    {
        //..
    }
    heeftIetsHerkend = false;
    heeftUitgevoerd = false;
}

Laatst gewijzigd op 14-11-2005 om 20:10.
Met citaat reageren
Oud 14-11-2005, 20:12
Marcade
Avatar van Marcade
Marcade is offline
Citaat:
Ninh schreef op 14-11-2005 @ 21:05 :
Code:
while(!quit)
{
    while(!heeftIetsHerkend)
    {
        //....
    }

    while(!heeftUitgevoerd)
    {
        //..
    }
    heeftIetsHerkend = false;
    heeftUitgevoerd = false;
}
Volgens mij is dit nou juist wat die heeft en waar het fout gaat; De eerste loop staat stil als de tweede loop bezig is.
Met citaat reageren
Oud 14-11-2005, 20:17
Verwijderd
Citaat:
Marcade schreef op 14-11-2005 @ 21:12 :
Volgens mij is dit nou juist wat die heeft en waar het fout gaat; De eerste loop staat stil als de tweede loop bezig is.
Erm, typisch geval van dat hoort niet?

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.
Met citaat reageren
Oud 14-11-2005, 22:07
Verwijderd
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 
If a< 5000 Then 
If ADCONV (1,4) < gevoeligheid Then
insertdisk
Else txtG = "Wacht"
End if
Else txtG = "wacht"
End if

En dat nog 7x (voor b,c,d,e,f,g,h)
nr = DoEvents
Loop
Daarna bepaalt de computer zijn zet en schrijft deze naar txtZ.
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.

Laatst gewijzigd op 14-11-2005 om 22:10.
Met citaat reageren
Oud 14-11-2005, 22:25
Verwijderd
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?
Met citaat reageren
Oud 14-11-2005, 22:32
Verwijderd
Allereerst even optimaliseren:

Code:
Do 
    If a< 5000 Then 
        If ADCONV (1,4) < gevoeligheid Then
            insertdisk
        Else
            txtG = "Wacht"
        End if
    Else
        txtG = "wacht"
    End if
    
    En dat nog 7x (voor b,c,d,e,f,g,h)
    nr = DoEvents
Loop
Dat is natuurlijk hetzelfde als:

Code:
Do
    If a < 5000 and ADCONV(1,4) < gevoeligheid Then
        insertdisk
    Else
        txtG = "Wacht"
    End If

    'etc...
Loop
Verder ben ik onbekend met VB, dus syntax wise zal het bovenstaande misschien niet geheel kloppen, maar algoritmisch gezien wel.
Wat 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?

Laatst gewijzigd op 14-11-2005 om 22:35.
Met citaat reageren
Oud 14-11-2005, 23:17
Marcade
Avatar van Marcade
Marcade is offline
Wat staat er precies in de subroutine Robot_aanroepen ?
Met citaat reageren
Oud 15-11-2005, 08:10
Verwijderd
Citaat:
Lucky Luciano schreef op 14-11-2005 @ 23:07 :

Voor deze herkenning is de volgende loop gebruikt:

Code:
Do 
If a< 5000 Then 
If ADCONV (1,4) < gevoeligheid Then
insertdisk
Else txtG = "Wacht"
End if
Else txtG = "wacht"
End if

En dat nog 7x (voor b,c,d,e,f,g,h)
nr = DoEvents
Loop
De 'En dat nog 7x' geeft aan dat de code niet optimaal is. Verplaats de code naar een functie. Maakt het geheel wat overzichtelijker (en makkelijker aanpasbaar).

Citaat:
Lucky Luciano schreef op 14-11-2005 @ 23:07 :

Daarna bepaalt de computer zijn zet en schrijft deze naar txtZ.
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.
Op welk moment bepaalt de computer de zet, en op welk moment wordt de robot aangeroepen?

Citaat:
Lucky Luciano schreef op 14-11-2005 @ 23:07 :
Verder heb ik het commando Thread nog nooit gezien en geen idee hoe het werkt.
Is ook niet interessant.

PS: Wat is ADCONV?

Laatst gewijzigd op 15-11-2005 om 08:16.
Met citaat reageren
Oud 15-11-2005, 09:29
Verwijderd
Citaat:
Lucky Luciano schreef op 14-11-2005 @ 23:25 :
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?
Het gaat dus fout bij het onthouden van de zet die de computer zelf doet. Dat wordt ergens een vlaggetje oid zetten.
Met citaat reageren
Oud 15-11-2005, 10:16
Warsocket
Avatar van Warsocket
Warsocket is offline
Citaat:
Lucky Luciano schreef op 14-11-2005 @ 23:25 :

Is het dan mogelijk om een nieuw project die waarde te laten ontvangen en de robothandeling te laten doen?
Daar bestaan Threads voor, 1 programma 2 codes die naast elkaar draaien, 2 programmas kan ook, maar

-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
__________________
01110100011001010111011001100101011001010110110000100000011101000
11010010110101001100100001000000011111100111111001000000011101001010000
Met citaat reageren
Oud 15-11-2005, 10:17
Verwijderd
Citaat:
eddie schreef op 15-11-2005 @ 09:10 :
De 'En dat nog 7x' geeft aan dat de code niet optimaal is. Verplaats de code naar een functie. Maakt het geheel wat overzichtelijker (en makkelijker aanpasbaar).


Op welk moment bepaalt de computer de zet, en op welk moment wordt de robot aangeroepen?


Is ook niet interessant.

PS: Wat is ADCONV?
Ik denk dat ADCONV, analoog digital convertor betekent.
Met citaat reageren
Oud 15-11-2005, 10:37
Verwijderd
Citaat:
Ninh schreef op 15-11-2005 @ 11:17 :
Ik denk dat ADCONV, analoog digital convertor betekent.
Oh. En die mooie constante parameters dan? ADCONV( 1, 4)?
Met citaat reageren
Oud 15-11-2005, 17:49
Verwijderd
Citaat:
eddie schreef op 15-11-2005 @ 11:37 :
Oh. En die mooie constante parameters dan? ADCONV( 1, 4)?
ADCONV (1,4) betekent dat een analoog signaal op poort 1 in een digitaal signaal wordt omgezet op schaalsoort 4.

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
Met citaat reageren
Advertentie
Reageren


Regels voor berichten
Je mag geen nieuwe topics starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Spring naar


Alle tijden zijn GMT +1. Het is nu 20:58.