Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Prog] VB: code uitvoeren tijdens oneindige loop (https://forum.scholieren.com/showthread.php?t=1302489)

Lucky Luciano 14-11-2005 18:23

[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?

eddie 14-11-2005 18:56

kun je het probleem wat beter uitleggen? :o

Manuzhai 14-11-2005 19:08

Ja, doe even wat pseudocode ofzo.

fosje 14-11-2005 19:17

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

Warsocket 14-11-2005 20:00

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

fosje 14-11-2005 20:04

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

Warsocket 14-11-2005 20:18

Citaat:

fosje schreef op 14-11-2005 @ 20:04 :
en wordt zijn loop dus te langzaam
heb het al verbeterd

Marcade 14-11-2005 20:58

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.

Nigo 14-11-2005 21:05

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;
}


Marcade 14-11-2005 21:12

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.

Nigo 14-11-2005 21:17

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.

Lucky Luciano 14-11-2005 23:07

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.

Lucky Luciano 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?

Nigo 14-11-2005 23:32

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?

Marcade 15-11-2005 00:17

Wat staat er precies in de subroutine Robot_aanroepen ?

eddie 15-11-2005 09:10

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?

eddie 15-11-2005 10:29

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.

Warsocket 15-11-2005 11:16

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

Nigo 15-11-2005 11:17

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.

eddie 15-11-2005 11:37

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)?

Lucky Luciano 15-11-2005 18:49

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 :)


Alle tijden zijn GMT +1. Het is nu 11:55.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.