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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что видит inner класс, запущенный в другом потоке? 
:(
    Опции темы
Dims
Дата 14.12.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



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

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

Одно место, которое я не совсем понимаю, это вот это:

Код


protected void fireException(final Exception e, final int line) {
      // Guaranteed to return a non-null array
      final Object[] listeners = listenerList.getListenerList();
      for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ExceptionListener.class) {
            final Object listener = listeners[i + 1];
            SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                  ( (ExceptionListener) listener).exceptionOccured(line, e);
                    }
                });
            }
        }
      }


Я оформил диалоговое окно как implements ExceptionListener (мой интерфейс с методом exceptionOccured). При помощи invokeLater я вызываю его в оконном потоке. Вызов производится при помощи создания inner class.

Так может быть, к моменту исполнения Runnable.run() значение переменной line может уже принимать другое значение, не то, которое было во время формирования? Или такого не может быть?
PM MAIL   Вверх
Dims
Дата 14.12.2007, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Я попытался сделать явную проверку на повторы, вот так

Код

     public static void checkfirednumber(int ln) {
       if( ln > 10 && ln == wasfirednumber ) {
          System.out.println("firednumber error:" + ln);
       }
       wasfirednumber = ln;
    }


и не обнаружил срабатываний.

Может ли быть так, что ошибка возникает либо от того, что слишком часто вызывается invokeLater либо слишком часто вызывается дополнение JList?

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

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


Опытный
**


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

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



А сколько и каких листенеров у вас в списке?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Dims
Дата 14.12.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Этого класса вроде бы один.

Я заметил, что проблема исчезает, если вместо invokeLater использовать invokeAndWait.

Такое впечатление, что проблема либо в самом списке (как будто он не успевает добавить один элемент, как ему добавляют другой), либо это просто глюк отображения. 
PM MAIL   Вверх
AlexeyVorotnikov
Дата 14.12.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что делает метод exceptionOccured()?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Dims
Дата 18.12.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Вот такой сейчас у него код:

Код

synchronized public void exceptionOccured(int line, Exception e) {
        errorsModel.addElement(line + ": " + e.getMessage());
      if( errorsModel.size() > 5000 ) {
         errorsModel.removeRange(0,4000);
      }
      DH.checkaddednumber(line);
        Rectangle rect = errorsList.getCellBounds(errorsModel.size() - 1, errorsModel.size() - 1);
        errorsScrollPane.getViewport().setViewPosition(rect.getLocation());
    }


Может быть, что-то надо определить, как volatile или что-то типа этого?
PM MAIL   Вверх
AlexeyVorotnikov
Дата 19.12.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Честно говоря, у меня больше нет никаких идей. Нужно смотреть дебагером что там происходит. Или хотя бы лог какой-нибудь писать.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Dims
Дата 19.12.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



А вот я как раз и написал класс DH, что расшифровывается Debug Helper, который, как раз и пишет лог. И я увидел, что никаких повторов в лог не попадает.

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

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

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


 




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


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

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