Avatar billede simonvalter Praktikant
27. september 2003 - 03:57 Der er 13 kommentarer og
2 løsninger

stoppe Thread

jeg kan ikke rigtigt hitte ud af hvordan jeg kan stoppe sådan en tråd her uden at bruge en depreached method
jeg har prøvet det her eksempel men det virker vist ikke
http://javaalmanac.com/egs/java.lang/StopThread.html?l=rel

jeg kan også se at selv om den bliver stoppet så ligger der stadig en idle tråd tilbage tror jeg nok.. jeg får vist lavet en ny hver gang jeg trykker .. skal man destroy den gamle .. og hvordan ?

  void this_mousePressed(MouseEvent e) {
    mousePressed = !mousePressed;

    thread = new Thread(
        new Runnable() {

      public void run() {
        while (true) {
          time = System.currentTimeMillis();
          while (mousePressed) {
            spendtime = (System.currentTimeMillis() - time);
            if (spendtime > 300) {

              if (off) {
                up();
                stateEnter();
                off = !off;
              }
              else if (!off) {
                down();
                stateEnter();
                off = !off;
              }
          // depreached
          //  thread.stop();
            }
          }
        }
      }
    }
    );
    thread.start();

  }
Avatar billede soreno Praktikant
27. september 2003 - 07:49 #1
Nedlæg en tråd ved at lade dens run-metode afslutte.
Din tråd kører i en while(true).
Avatar billede arne_v Ekspert
27. september 2003 - 08:36 #2
Erstat din thread.stop() med en break !
Avatar billede arne_v Ekspert
27. september 2003 - 08:38 #3
Det link du refererer til virker sikkert, men det er til en anden
problem-stilling nemlig den situation hvor main thread skal stoppe
tråden. I den situation er den anbefalede løsning i.s.f. thread.stop at
sætte en variabel og så lade tråden teste på den og afslutte.
Avatar billede soreno Praktikant
27. september 2003 - 08:58 #4
Det er da ikke nok at erstatte med break. Den hopper jo kun ud af første løkke. Så kører while(true) stadig.
Avatar billede arne_v Ekspert
27. september 2003 - 09:04 #5
Hov. Det har du ret i.

Jeg havde ikke observeret at der var 2 while løkker.

Så skal der jo nok bruges et flag.

Eller endnu bedre omstrukturere lidt da den inderste while løkk
ligner en CPU gnasker.
Avatar billede arne_v Ekspert
27. september 2003 - 09:05 #6
flag:

    public void run() {
        boolean flag = true;
        while (flag) {
          time = System.currentTimeMillis();
          while (mousePressed) {
            spendtime = (System.currentTimeMillis() - time);
            if (spendtime > 300) {

              if (off) {
                up();
                stateEnter();
                off = !off;
              }
              else if (!off) {
                down();
                stateEnter();
                off = !off;
              }
              flag = false;
            }
          }
        }
      }
Avatar billede simonvalter Praktikant
28. september 2003 - 04:47 #7
ok, jeg har kigget på det lidt idag men kan stadig ikke få det til at virke, men jeg er igang med et andet program så jeg kigger på det igen om et par dage og vender tilbage.

jeg ved ikke om det gør en forskel, men jeg har 2 action listeners der kan påvirke den thread
i kan se dem her
http://www.gbit.dk/bleh.txt
Avatar billede arne_v Ekspert
28. september 2003 - 16:40 #8
Jeg tror stadigvæk at det skal gribes anderleds an.

Kan du forklare hvad det er du vil opnå ?

Så kan vi evt. komme med andre løsnings modeller.
Avatar billede simonvalter Praktikant
28. september 2003 - 17:24 #9
det kan jeg da godt .. jeg sidder og prøver at lære om state og har i den forbindelse vil jeg lave en lys knap. afhængigt af hvordan man trykker på den sker der en ændring i dens state, hvis den er slukket og man trykker vil den tænde og omvendt. hvis man holder den inde i x antal ms vil den skrue op hvis den sidst var på vej op eller slukket og omvendt... og hvis man laver et hurtigt slip imens den var holdt inde vil den skifte retning...

for at eventen fra void this_mouseReleased påvirker while (mousePressed) i void this_mousePressed var jeg nødt til at lave det i en thread

det virker egentligt meget godt som det er, og jeg har da muligvis misforstået noget omkring det men lige nu er det eneste jeg har et problem med er at jeg helst ikke vile bruge en depreached method og lære at gøre det rigtigt.
men jeg er da åben for forslag om hvordan det skulle gøres.
Avatar billede arne_v Ekspert
28. september 2003 - 19:19 #10
Her er noget kode som måske kan give nogle ideer:

package test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.BorderLayout;

public class SpecialButton extends JFrame implements MouseListener {
    private JButton x;
    private boolean state;
    private double f;
    private boolean done;
    private Updater upd;
    public SpecialButton() {
        x = new JButton("Use mouse to change");
        x.setMaximumSize(new Dimension(100, 50));
        x.addMouseListener(this);
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(x);
        setSize(200, 100);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        state = true;
        f = 0.5;
        update();
    }
    public void mouseClicked(MouseEvent ev) {
    }
    public void mouseEntered(MouseEvent ev) {
    }
    public void mouseExited(MouseEvent ev) {
    }
    public void mousePressed(MouseEvent ev) {
        state = !state;
        f = 0.5;
        upd = new Updater();
        done = false;
        upd.start();
    }
    public void mouseReleased(MouseEvent ev) {
        done = true;
    }
    public void update() {
        Color basecol;
        if(state) {
            basecol = Color.RED;
        } else {
            basecol = Color.YELLOW;
        }
        Color col = new Color((int)(f * basecol.getRed()),
                              (int)(f * basecol.getGreen()),
                              (int)(f * basecol.getBlue()));
        x.setBackground(col);
    }
    public static void main(String[] args) {
        SpecialButton sb = new SpecialButton();
        sb.show();
    }
    private class Updater extends Thread {
        public void run() {
            while(!done) {
                update();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }
                f += 0.1;
                if(f > 1.0) {
                    f = 1.0;
                }
            }
        }
    }
}
Avatar billede simonvalter Praktikant
28. september 2003 - 20:25 #11
ok jeg kigger på det
Avatar billede simonvalter Praktikant
30. september 2003 - 20:33 #12
smid et svar arne_v og soreno
Avatar billede arne_v Ekspert
30. september 2003 - 21:00 #13
svar
Avatar billede soreno Praktikant
30. september 2003 - 21:24 #14
ditto
Avatar billede simonvalter Praktikant
01. oktober 2003 - 00:15 #15
jeg håber fordelingen er ok .. arnes eksempel gav mig noget at arbejde videre med.
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