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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> собственный обработчик... контроль изменения значения переменной.. 
V
    Опции темы
sith
Дата 2.4.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть такая задача...  нужно контролировать изменение значения переменной... как написать такой прослушивтель...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
polosatij
  Дата 2.4.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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




1. где
2. опиши задачу поконкретнее

 smile 


--------------------
PM   Вверх
sith
Дата 2.4.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хорошо... грубо говоря дело такое...
...  есть клиент есть сервер...
...  хочеться что бы они работали по событийному принципу... тоесть произошло событие(отправка/прием, разрыв соединнения и так далее) тогда они выполняют какие то действия... 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
chief39
Дата 2.4.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

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



Итого, есть два варианта событий:
поллинг(периодическое опрашивание)
коллбэк(явное уведомление слушателя о событии через предоставленную точку доступа)

Поллинг может осуществляться или по времени(раз в секунду, etc.) или по необходимости(я использую кэш курсов валют, в момент очередного использования делаю запрос не изменилось ли что-то в БД, т.е. "не произошло ли событие")

Коллбэк - это, к примеру,  метод в твоём ядре, которое должно узнавать о событии. Когда событие порисходит, то его виновник или исполнитель вызывает этот метод. Есть риск что в очередном исполнителе/инициаторе события можешь забыть его вызвать.

Определись что хочешь, 
опиши список событий, которые надо отслеживать, 
опиши как можно вообще вычислить наступления всех событий в твоём случае(что за коннекшны, кем реализованы, как происходит разрыв и где инфа хранится)
опиши требования к событийности: 
   немедленный отзыв с синхронизацией и недопущение когда хвост впереди головы: "сначала уволился, а потом написал заявление на увольнение", 
   просто запись событий в лог и отложенное выполнение действий по каждому факту события, etc

А пока просто понятно что тебе нужно "что-то эдакое, шоп ездило...". Ессно, никто не посоветует что лучше ставить на это "нечто": 13 или 15 дюймовые диски smile





--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
hamsterKSU
Дата 2.4.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 401
Регистрация: 20.10.2006
Где: Украина, Херсон

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



в большинстве книг в разделе "События" есть подраздел "пишем свое событие" там все написано.
ну а обших чертах так:

1. у тя в класе есть список слушателей события.
2. есть функция типа  FireMyEvent(MyEvent e) где происходит вызов метода слушателя, который реализовал твой интерфейс слушателя
3. в методе setXXX() вызываешь FireMyEvent и на этом все

Это сообщение отредактировал(а) hamsterKSU - 2.4.2007, 13:25
PM MAIL ICQ   Вверх
skyboy
Дата 2.4.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



не совсем понятно, что в данном случае переменная и при чем тут "обрыв соединения и так далее". если в общем виде, то изменение значения переменной можно отловить, если от "простых" типов вроде int перейти к классам с getter'ом и setter'ом: тогда ты точно будешь иметь инфо о изменении значения без "прослушивания", как процесса периодического запроса значения + сравнения.
PM MAIL   Вверх
sith
Дата 2.4.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



... конкретики так конкретики...
... есть класс клиента... в нем создаеться обьект GUI...  при нажатии кнопки должно устанавливаться соединение с сервером... но я не хочу что бы в гуи делались какие либо действия по установке соединения...   то есть клиент должен прослушивать состояние кнопки "установить соединение"... я предпологал так что в гуи будет поле  boolean connect  в которое будет записываться значение  true/false в зависимости от того нажата кнопка или нет... а клиент в цикле будет вызывать метод гуи  isConnect, но меня смущает этот цикл... не хочеться связываться с зацикливанием... мне кажеться что есть более простой и эффективынй способ...
 smile 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
skyboy
Дата 2.4.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(sith @  2.4.2007,  13:27 Найти цитируемый пост)
но я не хочу что бы в гуи делались какие либо действия по установке соединения...  

разве ГУИ и так не на стороне клиента? не совсем понятна эта фраза. вместо реакции на событие на клиенте, ты хочешь делать реакцию на событие в клиенте же? но только более извращенным способом? 
или тебе надо динамически менять список обработчиков? так есть  паттерн "Очередь" - можно при помощи его сделать динамическое подключение/отключение обработчиков... Или мотивация другая?
PM MAIL   Вверх
LSD
  Дата 2.4.2007, 14:40 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Создание собственных событий

При разработке приложений часто бывает нужно реализовать обработку неких событий. В Java cтандарным способ создания модели обработки событий, является метод описаный в спецификации JavaBeans.

Создадим собственный класс описывающий событие My. Обычно его наследуют от EventObject, а имя ИмяСобытияEvent.
Код
public class MyEvent extends EventObject
{
  private static final long serialVersionUID = -6326247162271636387L;
  private String            message;

  public MyEvent(Object source, String message)
  {
    super(source);
    this.message = message;
  }

  public MyEvent(Object source)
  {
    this(source, "");
  }

  public MyEvent(String message)
  {
    this(null, message);
  }

  public MyEvent()
  {
    this(null, "");
  }

  public String getMessage()
  {
    return message;
  }

  @Override
  public String toString()
  {
    return getClass().getName() + "[source = " + getSource() + ", message = " + message + "]";
  }
}


Создадим интерфейс слушателя. Тот кто желает получать уведомления о событиях, должен будет реализовать этот интерфейс. Имя интерфейса ИмяСобытияListener.
Код
public interface MyListener
{
  public void myWillHappend(MyEvent myEvent);

  public void myHappend(MyEvent myEvent);
}

в данном случае мы описали два метода, первый будет вызываться до того как событие My произойдет, второй после.

Теперь опишем класс который будет выполнять некую работу и оповещать всех заинтересованных слушателей. Класс должен содержать методы: addИмяСобытияListener, getИмяСобытияListeners и removeИмяСобытияListener. Так же обычно создают вспомогательные методы fireXXX, для того чтобы было удобней оповещать слушателей.
Код
public class MyEventProducer
{
  private ArrayList<MyListener> listeners = new ArrayList<MyListener>();

  public void addMyListener(MyListener listener)
  {
    listeners.add(listener);
  }

  public MyListener[] getMyListeners()
  {
    return listeners.toArray(new MyListener[listeners.size()]);
  }
  
  public void removeMyListener(MyListener listener)
  {
    listeners.remove(listener);
  }
  
  protected void fireMyWillHappend(String message)
  {
    MyEvent ev = new MyEvent(this, message);
    for(MyListener listener : listeners)
      listener.myWillHappend(ev);
  }
  
  protected void fireMyHappend(String message)
  {
    MyEvent ev = new MyEvent(this, message);
    for(MyListener listener : listeners)
      listener.myHappend(ev);
  }
  
  public void doWork(String workName)
  {
    fireMyWillHappend("begin work " + workName);
    try
    {
      Thread.sleep(1000);
    }
    catch(InterruptedException e)
    {
    }
    fireMyHappend("end work" + workName);
  }
}


А теперь проверим как это все вместе работает:
Код
public static void main(String[] args)
{
  MyEventProducer eventProducer = new MyEventProducer();
  eventProducer.addMyListener(new MyListener()
  {
    public void myHappend(MyEvent myEvent)
    {
      System.out.println("myHappend() " + myEvent.getMessage());
    }

    public void myWillHappend(MyEvent myEvent)
    {
      System.out.println("myWillHappend() " + myEvent.getMessage());
    }
  });
  eventProducer.doWork("my-job");
}



--------------------
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   Вверх
sith
Дата 2.4.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мда... солидно...
... попробую уточнить.. ибо мне не все здесь понятно... как реализовать такую задачу...
... мне нужно что бы слушатель следил за приходом обьектов по сети... обьект пришел... слушатель выбарсывает флаг и перадет обьект нужному методу... как это сделать... используя выше упомянутый принцип...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 2.4.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(sith @  2.4.2007,  15:11 Найти цитируемый пост)
... мне нужно что бы слушатель следил за приходом обьектов по сети... обьект пришел... слушатель выбарсывает флаг и перадет обьект нужному методу...

Слушатель должен следить по сети, или объекты приходят по сети?


--------------------
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   Вверх
sith
Дата 2.4.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 2.4.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



После того как прочитал объект вызывай соответсвующий fireXXX() метод.


--------------------
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   Вверх
sith
Дата 2.4.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну не понятно мне... б..я
... выкладываю свои исходники...
...


Код

public interface MyListener {
    public void changeValue(MyEvent myEvent);
}


Код

public class TestForm extends javax.swing.JFrame /*implements MyListener*/{
  private int i = new Integer(0);
   String s = new String();
    ArrayList listeners = new ArrayList();
    /** Creates new form NewJFrame */
    public TestForm() {
        initComponents();//этот метод создает окно с кнопкой
        this.setVisible(true);
        this.setLocation(300,300);
       
    }
    public void addMyListener(MyListener listener){
    listeners.add(listener);
    }
    public void setValueI(int newI){
    fireMyWillHappend();
    this.i = newI;
    }
     protected void fireMyWillHappend()
  {
    MyEvent ev = new MyEvent(this,"hello");
    
   
    
    
  }
    public int getValueI(){
    return i;
    }
    
                 

    public void changeValue(MyEvent myEvent) {
        System.out.println("value change"+i);
    }
    
    /**
     * @param args the command line arguments
     */
    
              
    private javax.swing.JButton test;
            
    
}



Код
 public static void main(String[] args) {
    TestForm f = new TestForm();
     
    }


... как в главном методе, если я все сделал правильно вызвать обработчик событий...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 2.4.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код
  protected void fireMyWillHappend()
  {
    MyEvent ev = new MyEvent(this, "hello");
    for(Iterator iter = listeners.iterator(); iter.hasNext();)
    {
      MyListener listener = (MyListener) iter.next();
      listener.changeValue(ev);
    }
  }



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

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

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


 




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


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

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