[Java] Lus probleem

Pagina: 1
Acties:

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 11:39
Hallo,

Ik ben bezig met het maken van een temperatuurgenerator met wat mvc erbij.
Alleen zodra ik de temperaturen in een lus wil laten genereren loopt mijn applet vast, als ik de lus eruit haal en iedere keer op de start knop druk worden er wel temperaturen gegenereerd

Java:
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
102
103
104
105
106
import java.util.*;

public class TemperatuurModel extends Observable {
    
    private int temperature;
    
    private String text;
    
    public TemperatuurModel()
    {
        
    }
    /**
     * Get the current temperature
     * @return  temperature
     */
    public int getTemp()
    {
        return this.temperature;
    }
    
    /**
     * Set the generated temperature
     * @param temp
     */
    public void setTemp(int temp)
    {
        this.temperature = temp;
        this.update();      
    }
    
    
    /**
     * Get the text
     * @return text
     */
    public String getText()
    {
        return this.text;
        
    }
    
    /**
     * Set a textmessage
     * @param text
     */
    public void setText(String text)
    {
        this.text = text;
        this.update();
    }
    
    /**
     * Start the generator
     * 
     * 
     *
     */
    public void start()
    {   
        this.run(true);
        this.setText("STARTED!");
        
    }
    
    
    /**
     * Stop the generator
     *
     */
    public void stop()
    {
        
        this.run(false);
        this.setText("STOPPED!");
        
    }
    
    /**
     * The actual generator
     * Generates temperatures
     * @param run
     */
    private void run(boolean run)
    {
        while(run){
            this.setTemp((int)(Math.random()*100));
            
            try{ Thread.sleep(5000);}
            catch(InterruptedException e){
                System.err.println("Thread interrrupted!");
                e.printStackTrace();
                }
            }
    }

    /**
     * For updating the views
     *
     */
    private void update()
    {
        setChanged();
        notifyObservers();
    }
}


Ik zie alleen niet wat er fout gaat :S

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Tja, een beetje zelf debuggen helpt meestal wel.
Wat er mis gaat: je roept éénmaal je functie run op, met als true als argument. Die loop blijft dus oneindig lopen. Als je wil stoppen, roep je nogmaals run aan. Echter, hier wordt de functie gewoon nog een keer aangeroepen, en loopt hij nooit. Het is niet zo dat je eerste loop hierdoor gaat stoppen.
Zorg ervoor dat je stop method een member variable op false zet, en check in je loop op die member variable.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TemperatuurModel
{
    private bool _stop = false;

    public void run()
    {
        while( _stop == false )
        {
             ...
        }
    }

    public void stop()
    {
        _stop = true;
    }
}

https://fgheysels.github.io/


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

In je lus werk je op een lokale guard genaamd 'run' die, als hij eenmaal op true staat, nooit meer false kan worden binnen deze context... Ik kan dat niet vanaf hier zien, maar ik hoop dat je verschillende threads hebt voor je GUI en model. Als laatstgenoemde intensief werk moet verrichten en je hebt zowel GUI als model in 1 thread, dan is je GUI niet langer meer responsive omdat het geen timeslice krijgt.

[edit]
Aargh, spuit 11 :(

[ Voor 3% gewijzigd door prototype op 05-03-2007 12:06 ]


  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 11:39
Dat maakt geen verschil, de applet blijft "vastlopen" en reageert nergens op

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Isengrim schreef op maandag 05 maart 2007 @ 12:08:
Dat maakt geen verschil, de applet blijft "vastlopen" en reageert nergens op
Wat versta je overigens onder vastlopen en werk je wel met verschillende threads? Voor zover wij nu namelijk kunnen zien laat je de thread binnen de lus 5sec slapen, wat jij misschien als vastlopen kan ervaren...

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 11:39
Er gebeurt niets als ik op start klik, er worden geen temperaturen gegeneerd en ik kan niet op andere knoppen klikken.
Als ik de lus er uit haal werkt dit allemaal wel :S

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Loop er eens doorheen met javadebugger, zet je breakpoint op de regel van waar je lus begint en step er dan eens doorheen.

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 11:39
Er worden wel temperaturen gegenereerd, alleen neemt de UI deze niet over

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Isengrim schreef op maandag 05 maart 2007 @ 12:25:
Er worden wel temperaturen gegenereerd, alleen neemt de UI deze niet over
Gokje ;) Repaint je de UI wel bij elke update?
Pagina: 1