[java] fout met stoppen thread

Pagina: 1
Acties:

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Hoi GoT members ..

Ik heb een vraagje :

Ik ben nu bezig met het leren van threads en nu heb ik een voorbeeldje uit het boek java stap voor stap over getikt, maar nu zit er waarschijnlijk een foutje in?!?

Het is een programmaatje dat een bal heen en weer laat stuiteren binnen een vierkantje.

In het boek staat dat ik via een while lus die controleert of de boolean keepGoing nog true is de thread doorloopt en zodra dat de boolean false (dmv het op de stop knop drukken dan word de methode pleaseStop aangeroepen en boolean keepGoing=false) is dat dan de thread stopt.

Ik weet niet wat er fout is ik heb alles al geprobeerd, weten jullie wat hier verkeerd staat?

Alvast bedankt Patrick
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

    public class Opgave204 extends Applet implements ActionListener
    {
      private Button btStart,btStop;
      private Ball ball;

      public void init()
      {
        btStart = new Button("Start");
        add(btStart);
        btStart.addActionListener(this);

        btStop = new Button("Stop");
        add(btStop);
        btStop.addActionListener(this);
      }

      public void actionPerformed(ActionEvent e)
      {
        if (e.getSource() == btStart)
        {
            Graphics g = getGraphics();
            Ball ball = new Ball(g);
            ball.start();
        }

        if (e.getSource() == btStop)
            ball.pleaseStop();
      }

    }

    class Ball extends Thread
    {
      private Graphics g;
      private int x = 0, xChange = 7;
      private int y = 0, yChange = 2;
      private int diameter = 10;
      private boolean keepGoing;

      private int rectLeftX = 0, rectRightX = 100;
      private int rectTopY = 0, rectBottomY = 100;

      public Ball(Graphics graphics)
      {
        g = graphics;
        keepGoing = true;
      }

      public void pleaseStop()
      {
        keepGoing = false;
      }

      public void run()
      {
        g.drawRect(rectLeftX, rectTopY,
            rectRightX-rectLeftX, rectBottomY-rectTopY);

        while (keepGoing)
        {

            g.setColor(Color.lightGray);
            g.fillOval( x, y, diameter, diameter);

            if ( y + yChange <= rectTopY)
              yChange = -yChange;

            if ( y + yChange + diameter >= rectBottomY)
            yChange = -yChange;

            if ( x + xChange >= rectRightX)
            xChange = -xChange;

            if ( x + xChange <= rectLeftX)
            xChange = -xChange;

            y = y + yChange;
            x = x + xChange;


            g.setColor(Color.red);
            g.fillOval(x, y, diameter, diameter);


            try
            {
            Thread.sleep(50);
            }
            catch (InterruptedException e)
            {
            System.err.println("sleep exception");
            }
        }

      }

    }

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Een ander voorbeeldje hier

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

O dat,
dat leggen ze in het boek fout uit.
Als de Thread loopt dan kun je de gui niet meer aanroepen. Dus je moet wachten totdat de thread klaar is met lopen..

je kunt ook de gui in een thread zetten en dan werkt het wel..


(troost je, al jaren lang breken mensen hun hoofd daar over)

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
hmm.... wat raar ja ... ik moet dan maar ff puzzelen nog :)

Ik moet nu een animatie maken van een soort lift, die met een knop omhoog kan en met een knop omlaag kan gaan.. zou ik dit moeten doen met 2 threads? eentje voor omhoog laten bewegen van de "lift" en de ander voor omlaag laten bewegen?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op dinsdag 25 september 2001 13:15 schreef -P@tRiCk- het volgende:
hmm.... wat raar ja ... ik moet dan maar ff puzzelen nog :)

Ik moet nu een animatie maken van een soort lift, die met een knop omhoog kan en met een knop omlaag kan gaan.. zou ik dit moeten doen met 2 threads? eentje voor omhoog laten bewegen van de "lift" en de ander voor omlaag laten bewegen?
oude tijden herleven :)

wat ik deed. was gewoon aangeven naar boven en naar beneden.
de thread laten lopen, wachten tot ie klaar is en weer drukken.. :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum volgens mij kan dit wel gewoon alleen dan op een andere manier... Je moet namelijk niet vanuit die thread op een graphics gaan zitten kliederen :) .

Je kunt (gelukkig) vanuit een GUI gewoon een nieuwe thread starten. De GUI blokkeert dan niet omdat die thread gewoon vrolijk door gaat werken en de thread startende methode even vrolijk stopt. AWT is ook thread-safe dus dat is ook geen probleem.

Je moet alleen wel je variabele keepGoing beschermen. Die kan nu door twee threads tegelijk wordeb gebruikt en dat moet je nooit doen :) . Je kunt het beste de methode pleaseStop synchronized maken en een tweede methode "mustStop" maken die een boolean oplevert. Deze moet ook synchronized zijn. Staat dat niet in dat boek :?

Om het tekenen te herstellen moet je eigenlijk van de Ball een aparte UI component maken. Deze voeg je toe aan je applet en je verandert vanuit de thread de locatie van deze Ball. Als het goed is moet het dan werken :) . Probeer het anders eerst eens gewoon met een Label :) . Eventueel kan hoef je er niet percee een componenten van te maken en zorg je dat je de locatie van de ball instelt in de applet. Daarna roep je repaint() aan en het werkt :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Op dinsdag 25 september 2001 13:53 schreef mbravenboer het volgende:


Je moet alleen wel je variabele keepGoing beschermen. Die kan nu door twee threads tegelijk wordeb gebruikt en dat moet je nooit doen :) . Je kunt het beste de methode pleaseStop synchronized maken en een tweede methode "mustStop" maken die een boolean oplevert. Deze moet ook synchronized zijn. Staat dat niet in dat boek :?
Het bovenstaande voorbeeld is letterlijk overgetikt uit het boek java stap voor stap( kan het wel ff inscannen :)). Ik ben ook nog maar sinds vandaag bezig met threads :) ik wou gewoon ff kijken hoe alles werkt enzo. Maar toen liep ik tegen dat probleem aan :(

Ik kijk nog wel even in het boek wat er in staat over synchronized....toch alvast bedankt!

  • Tuinhark
  • Registratie: April 2000
  • Laatst online: 21-09 18:48

Tuinhark

Retro

Verander:
code:
1
Ball ball = new Ball(g);

naar:
code:
1
ball = new Ball(g);

Je werkt gemixt met lokale en globale scope. Other than that, treedt er een probleem op zodra je op stop drukt en je nog niet op start had gedrukt.

:Y)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Prutsboek ;) .

Snap je wat ik bedoelde met dat tekenen? Dat synchronized gebeuren veroorzaakt namelijk waarschijnlijk niet je probleem...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Tuinhark: Je werkt gemixt met lokale en globale scope.
Hum verrek die had ik nog geeneens gezien ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
hey....dat is het! ik zie net in het module boek van ons dat daar een tik fout in het boek staat.

Probleem dus opgelost!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: Probleem dus opgelost!
Mooi :) maar vergeet niet ook de andere fouten/lelijke zaken nog ff te bekijken :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Jester
  • Registratie: September 2000
  • Laatst online: 12-09 20:21
Hallo, dat is een voorbeeld waar 't nog niet eens over threads gaat.. Ik heb dat boek ook, check Hoofdstuk 25 maar even :)

HS-Bos zeker :P

- hardware always changes.. -


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
die andere fouten/ lelijke zaken daarmee bedoel je dat met synchronized?
daar heb ik nog geen kaas van gegeten hoor :)

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Op dinsdag 25 september 2001 14:41 schreef Jestar het volgende:
Hallo, dat is een voorbeeld waar 't nog niet eens over threads gaat.. Ik heb dat boek ook, check Hoofdstuk 25 maar even :)

HS-Bos zeker :P
Ik weet dat dit hoofdstuk 25 is :) dit voorbeeld staat ook in hoofdstuk 25 duh ;)

Wij moeten alleen nog h20 21 en dan h25 nog :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: die andere fouten/ lelijke zaken daarmee bedoel je dat met synchronized?
Yep en die Graphics mee geven is ook niet echt super netjes, maar kennelijk werkt dat dus wel goed...
daar heb ik nog geen kaas van gegeten hoor :)
Hehe :) . Moeilijk is het niet hoor (althans...). Als je een methode synchronized maakt dan zorg je ervoor dat er maar 1 thread tegelijk die methode in mag. Hierdoor kunnen er nooit 2 threads tegelijk aan 1 variabele zitten, wat erg gevaarlijk is. Als je multi-threaded werkt moet je er altijd voor zorgen dat variabelen maar door 1 thread tegelijk kunnen worden gebruikt door ze te beschermen met synchronized. Simpel toch? ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op dinsdag 25 september 2001 14:41 schreef Jestar het volgende:
Hallo, dat is een voorbeeld waar 't nog niet eens over threads gaat.. Ik heb dat boek ook, check Hoofdstuk 25 maar even :)

HS-Bos zeker :P
HsBos? dan schiet Huysmans wel op, we waren na een paar weken nog niet bij hoofdstuk 25 hoor ;) eerder bij hoofdstuk 5 :)

p.s. synchronized leer je in jaar 2, bij OS van de Niet ;)

  • Slamdance
  • Registratie: Juni 2001
  • Laatst online: 11-09 09:46
misschien is dit ook wel handig of bedoel je deze

source van de 1e en van de 2e

alle programma's in het boek zijn hier te vinden

Verwijderd

p.s. synchronized leer je in jaar 2, bij OS van de Niet ;)
Iets leren bij de Niet :?
Dat is een paradox
(Maar dat leer je weer bij discrete wiskunde bij Wolffelaar. :))
Pagina: 1