Avatar billede evilfish Nybegynder
04. marts 2007 - 10:58 Der er 6 kommentarer og
1 løsning

Wait() problem i LEGO mindstorm programmering

Hej eksperter

Jeg kommer med en lidt svær en, vil jeg tro. Det kan godt være problemet ikke er så svært som jeg tror det er, men sådan her ligger landet.

Jeg arbejder på et projekt i min skole, hvor jeg skal programmere en LEGO Mindstorm robot til at køre rundt på en bane. Billeder kan ses her:

Bane: http://www.evilfish.dk/other/maze.jpg
Robot: http://www.evilfish.dk/other/robot.jpg

Indtil videre har vi faktisk fået den til at lave nogle små ting, der kan hjælpe den med at navigere. Men nu til problemet:

Da den skal kunne lave nogle forskellige ting på samme ting, er Tråd programmering nødvendig. Ikke noget jeg ikke har prøvet før, men jeg er kommet til et problem jeg ikke forstår.

Jeg får en IllegalMonitorException ved en wait(), som jeg ikke får andre steder. Når jeg kigger i en FAQ for LEGO mindstorm robot programmering siger den følgende:

Q: I keep getting IllegalMonitorStateException.What is the reason for this?
A: This is standard Java behavior.When you call wait, notify, or notifyAll on an
object, you must own that object’s monitor (for example, have synchronized
access to it).

Her er koden for det pågældende sted, hvor fejlen sker.

public void run()
    {
        move.setPower(2);
        move.rotateRight();
        while(true)
        {
            try
            {
                if(lvh.getState() == LineState.BLACK)
                {
                    Sound.beep();
                    while(lvh.getState() == LineState.BLACK)
                    {
                        sleep(2);
                        wait();
                    }
                }
               
            }
            catch(IllegalMonitorStateException e)
            {
                Sound.buzz();
                while(!Button.VIEW.isPressed())
                {
                    LCD.showNumber(2009);
                }
                System.exit(1);
            }
            catch(InterruptedException e)
            {
                // TODO Auto-generated catch block
               
            }
           
        }

Det skal lige siges at Mindstorm robotten programmeres til en Java RunTime maskine som hedder LejOS. API’en til denne kan finder her: http://www.evilfish.dk/other/lejosAPI/

Nogen der har en god ide hvorfor min wait() laver den fejl den laver?
Avatar billede kalp Novice
04. marts 2007 - 11:05 #1
hvis der er metoder som flere tråde kan have adganng til skal de markeres som syncronized
Avatar billede evilfish Nybegynder
04. marts 2007 - 11:33 #2
Ja det siger FAQ'en - Men der er ikke metoder som ikke er synchonized, som det stykke kode som jeg har vist, som flere tråde har adgang til. Derfor forstår jeg ikke fejlen
Avatar billede Slettet bruger
04. marts 2007 - 13:59 #3
Hvad er det du gerne vil opnå med wait på det sted?

Du kan som fejlbeskeden siger kun kalde wait hvis du har låsen til monitoren for det objekt som wait bliver kaldt fra. Dette kræver at wait bliver udført i en synchronized metode eller en synchronized block. F.eks. synchronized (this) {wait();}.

Men, hvordan vil du vække tråden igen? Det kræver jo et notify eller notifyAll fra en anden tråd, som har låsen til samme objekt.

Du kunne evt. lave en klasse som indholdte 2 synkroniserede metoder hvori wait og notifyAll metoderne bliver kaldt. Du medgiver så samme instans af objektet til constructøren for den tråd der kalder wait og den der kalder notifyAll.
Avatar billede evilfish Nybegynder
04. marts 2007 - 14:13 #4
Ahh - Nu tror jeg har forstået det. Problemet er lidt meget kompliceret kan jeg så se. Jeg mokker lidt med det, og melder tilbage om fejlen er rettet
Avatar billede evilfish Nybegynder
05. marts 2007 - 11:52 #5
Okay status:

Jeg har rodet lidt med problemet. Jeg har ikke løst problemet, men fjernet det ved en refactoering. Fordi jeg vil have wait på, var fordi noget sensor aflæsning gik langsomt, og var bange for det var den kode overfor der var medskylding i det. Derfor vil jeg wait den, når den ikke skulle bruges.

Efter lidt nærmere undersøgelse, fandt jeg ud af at jeg lavede noget dobbelt arbejde på sensoren, som var helt hen i vejret, og har nu refactoeret det, så det er mere effektivt. Derved er det første problem jeg havde forsvundt, og nu skal det bare rekonstrueres anderledes.

jjust, det var dig der fik mig til at se på problemet med andre øjne, så derfor mener jeg at du har svaret på spørgsmålet. Så læg venligst et svar :)
Avatar billede evilfish Nybegynder
11. marts 2007 - 23:27 #6
Okay Jjust - du får en uge til at svare ellers lukker jeg tråden :)
Avatar billede Slettet bruger
11. marts 2007 - 23:39 #7
Sorry...jeg glemte tråden igen! Godt du fandt ud af det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB