Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прекратить поток, Цикл не прекращается 
:(
    Опции темы
Nodir
Дата 9.7.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

Репутация: нет
Всего: нет



Есть два Button` а. В первом кнопке есть такая функция.
Код

void go(){
    boolean doStop = false;
    while (!doStop){
        System.out.println("going...");
    }
}
Код

На втором кнопке поставил-->
void stop(){
    doStop = true;
}


Когда запускаю первую кнопку он начнет работать и никак не дает работать второму. Как можно 
делать так штобы пользователь мог нажать на вторую кнопку и прекратить работу первога ?...

Добавлено @ 10:07 
Sorry, ни тот прописал.

Код

boolean doStop = false;
void go(){
    while (!doStop){
        System.out.println("going...");
    }
}

На втором кнопке поставил-->
Код

void stop(){
    doStop = true;
}


Когда запускаю первую кнопку он начнет работать и никак не дает работать второму. Как можно 
делать так штобы пользователь мог нажать на вторую кнопку и прекратить работу первога ?...
 
PM MAIL   Вверх
LSD
Дата 9.7.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Весь GUI работает в одном потоке AWT Event Dispatch Thread, и пока ты не выйдешь из обработчика события весь GUI будет стоять. Тебе нужно в обработчике первой кнопки запустить отдельный поток:
Код
Runnable task = new Runnable()
{
  public void run()
  {
    while(!doStop)
    {
      System.out.println("going...");
    }
  }
};
Thread thread = new Thread(task);
thread.start();
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
newObject
Дата 10.7.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



На самом деле это может и не помочь. 
Цитата

 ... Если не приостанавливать работу потока, JVM может быть перегруженна командами текущего потока и управление центрального процессора не будет передаваться другим потокам...

Можно в конце каждой итерации воткнуть sleep(5). Этого может быть достаточно.
Так же можно воспользоваться методом InvokeLater().
Почитать по этому поводу можно:
Майкл Могран "Java 2 Руководство разработчика."
     Глава 15 Разработка многопоточных приложений 

Иван Портанкин серия "Библиотека программиста" "Swing эфективные пользовательские интерфейсы"
     Глава 2 .... За кулисами системы обработки событий 
Пример из этой книги:
Код

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

public class InvokeLater extends JFrame { 
    public InvokeLater() { 
        super("InvokeLater");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        button = new JButton("Make hard job");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new ComplexJobThread().start();
                button.setText("Waite..."); 
                button.setSize(80, 20);
            } 
        });
        button.setSize(80, 20);
        getContentPane(). setLayout(new FlowLayout());
        getContentPane().add(new JTextField(20));
        getContentPane().add(button); 
        setSize(400, 200);
        setVisible(true);
    }
    private JButton button; 
    class ComplexJobThread extends Thread { 
        public void run() { 
            try{
                sleep(3000);
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                       button.setText("All done");
                       button.setSize(80, 20);
                    }
                });
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new InvokeLater();
    }
}


Последнию книгу ОЧЕНЬ рекомендую прочесть, как для конкретной проблемы так и для общего ознакомления.   

Это сообщение отредактировал(а) newObject - 10.7.2006, 09:02
PM MAIL   Вверх
LSD
Дата 10.7.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(newObject @ 10.7.2006,  10:00)
На самом деле это может и не помочь. 
Цитата

 ... Если не приостанавливать работу потока, JVM может быть перегруженна командами текущего потока и управление центрального процессора не будет передаваться другим потокам...

Можно в конце каждой итерации воткнуть sleep(5). Этого может быть достаточно.
Так же можно воспользоваться методом InvokeLater().

InvokeLater() - здесь точно нельзя применять, т.к. это опять будет работать в AWT Dispatch Thread и опять весь GUI встанет.

А по поводу того что надо обязательно отдавать тики, это не совсем так. Thread-ды с равными приоритетами, будут получать процессорное время приблизительно поровну. Тем более, что AWT Dispatch Thread и так их отдает, если нет сообщений. А когда надо будет он свое получит, т.к. приоритет у него выше среднего. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
newObject
Дата 11.7.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Цитата

InvokeLater() - здесь точно нельзя применять, т.к. это опять будет работать в AWT Dispatch Thread и опять весь GUI встанет.


Настоятельно рекомендую скомпилить и запустить пример из предидущего поста и рассказать про впечатление. 
Т.к. пример как раз и иллюстрирует работу GUI, в то время как выполняется поток метода InvokeLater.

P.S. пример компилился под 1.5 все работало. 
PM MAIL   Вверх
powerOn
Дата 11.7.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(newObject @  11.7.2006,  12:02 Найти цитируемый пост)
Настоятельно рекомендую скомпилить и запустить пример из предидущего поста и рассказать про впечатление. 
Т.к. пример как раз и иллюстрирует работу GUI, в то время как выполняется поток метода InvokeLater.

P.S. пример компилился под 1.5 все работало.  


Твой пример работает правильно, не из-за того что используешь InvokeLater, а вот из-за этой строки:
Код

          new ComplexJobThread().start(); // 12


Ты создаешь новый поток, и уже в нем запускаешь:
Код

EventQueue.invokeLater(new Runnable() {
                    public void run() {
                       button.setText("All done");
                       button.setSize(80, 20);
                    }
                });
 

Конечно GUI не встанет при таком раскладе, поскольку код выполняется вне AWT Event Dispatch Thread. Вот если в 12 строке вместо метода start() вызывать метод run(), то GUI встанет. Так код тоже будет работать:

Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class InvokeLater extends JFrame { 
    public InvokeLater() { 
        super("InvokeLater");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        button = new JButton("Make hard job");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new ComplexJobThread().start();
                button.setText("Waite..."); 
                button.setSize(80, 20);
            } 
        });
        button.setSize(80, 20);
        getContentPane(). setLayout(new FlowLayout());
        getContentPane().add(new JTextField(20));
        getContentPane().add(button); 
        setSize(400, 200);
        setVisible(true);
    }
    private JButton button; 
    class ComplexJobThread extends Thread { 
        public void run() { 
            try{
                sleep(3000);
// Не используем EventQueue.invokeLater и все работает так же.
//                EventQueue.invokeLater(new Runnable() {
//                    public void run() {
                       button.setText("All done");
                       button.setSize(80, 20);
//                    }
//                });
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new InvokeLater();
    }
}
  

Это сообщение отредактировал(а) MoonCat - 11.7.2006, 12:25


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
newObject
Дата 11.7.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Во первых приношу свои извинения за неверную формулировку. Действительно нужно делать это в отдельном потоке.
Во вторых метод invokeLater был выбран для правильного изменения компонента.
В третих MoonCat вы в сове время объясняли Zone51 что в методах lookup() и rebind() нужно
указать протокол rmi. Где можно узнать об этом побольше, .т.к. в мануале и книгах что у меня есть ни слова об этом?
Кстати если дадите рекомендации по моему открытому посту, буду благодарен! smile 


 
PM MAIL   Вверх
LSD
Дата 11.7.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(newObject @  11.7.2006,  16:11 Найти цитируемый пост)
Кстати если дадите рекомендации по моему открытому посту, буду благодарен!

Попробуй почитать Java RMI от O'Reilly. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 11.7.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(newObject @  11.7.2006,  16:11 Найти цитируемый пост)
Где можно узнать об этом побольше, .т.к. в мануале и книгах что у меня есть ни слова об этом?


Здесь есть переводы мануалов по основам RMI. 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.