Button START / STOP

0

Mam problem. Napisalem program, ktory wykonuje ruchy kursorem w wyznaczone przeze mnie miejsca.
Przycisk "Start" odpowiada za uruchomienie tych akcji.
Chciałbym, żeby po ponownym wcisnięciu przerwał działanie.
Przycisk sie nie zwalnia i nic sie nie da wcisnąć, dopóki nie zakonczy działania.
Dowiedzialem się kilka dni temu o wielowątkowości, i że należałoby ją tu zastosować,
jednak stop() mi nie działa,gdyż wprawdzie tekst na przycisku zmieni się ze "Stop" na "Start" z powrotem tak jak powinno, ale program
nadal wykonuje ruchy myszką.
Próbowałem użyć while do zatrzymania wątku, ale też jakoś słabo z tym.
Macie jakiś pomysł??
Może jakiś przykładowy kod.
Z góry dzięki

0

Możesz spróbować przerwać działanie wątku przy pomocy interrupt(), tylko musisz wtedy w kodzie wrzucić blok, który złapie InterruptedException(czy jakoś tak), ewentualnie użyć funkcji isInterrupted(), jeśli dziedziczysz po Thread, a nie implementujesz Runnable.

0
gepir napisał(a):

Możesz spróbować przerwać działanie wątku przy pomocy interrupt(), tylko musisz wtedy w kodzie wrzucić blok, który złapie InterruptedException(czy jakoś tak), ewentualnie użyć funkcji isInterrupted(), jeśli dziedziczysz po Thread, a nie implementujesz Runnable.

Poczytam, zobaczę, spróbuję i dam znać.

0

niby takie proste, a nie moge zrobic tego przycisku do wyłączania zadania. Ciągle tamten jest wciśnięty mimo wątków.

public class PierwszyWatek extends Thread{
public void run(){

// W tym miejscu mam swoje zadanie dla programu (ruchy kursorem myszki)

}
}




public class Program{
public static void main(String [] args){
Thread watek1 = new PierwszyWatek();

// Tu duzo kodu pominąłem tylko to co wazne pokazuje

JButton btnStart = new JButton("Start");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
watek1.run();
}
});

//powyzej jest przycisk do startowania. Zmienilem zdanie i zrobie dwa przyciski. Jeden start, a drugi stop

// teraz Stop

JButton btnStop = new JButton("Stop");
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
watek1.stop();
}
});

'

Niestety program nie działa jak należy, bo gdy wcisnę przycisk Start, to dzieje się akcja, i jego nie da się zwolnić ani nic nacisnąć dopóki się nie skończy.

0

Ok, znalazłem jeden błąd.
tam mam **watek1.run() ** a powinno byc watek1.start();

Teraz pozostaje taki problem, że nie mogę później ponownie uruchomić zadania, chociażby od nowa(nie chodzi mi o wznowienie tylko wszystko od początku).
Wyskakuje mi taki error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Test$2.actionPerformed(Test.java:52)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

0

http://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java
Tutaj masz ciekawy wątek na stacku o tym. Z tego co czytam, to może przydać ci się wspomniany tam pomysł z ustawieniem flagi, której zmiana spowoduje zakończenie run(). Wydaje mi się, że potem powinno się dać ponownie odpalić wątek.

0

A może iść z duchem czasu i użyć CompletableFuture? :) https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1