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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> апплет и потоки 
:(
    Опции темы
Keyo
Дата 10.4.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема следующая. Имеется главный класс апплета. Имеется класс расширяющий Thread
далее он запускается в отдельном потоке и переодически (10 секунд) получает данные с сервера

схематически это выглядит примерно так
Код

public class DataManager extends Thread {

public synchronized List getData() {
//пропущу начало
            final URL url = new URL(urlAddr);

            connection = (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("GET");
// и. т.д.
}

private static int counter = 1; //завел счетчик чтобы посмотреть когда он останавливается

 public void run() {
        boolean interrupted = false;

        try {

            while (true) {
                Thread.sleep(DELAY * 1000);

                System.out.println(counter++);

                List list = getData();
                //ну и далее в этом месте идет обработка данных
                MainFrame.getInstance().set(list);
                MainFrame.getInstance().repaintAll();
            }
        } catch (final InterruptedException ex) {
            interrupted = true;
        } finally {
            if(interrupted) Thread.currentThread().interrupt();
        }
    }
}

public class MainFrame extends JApplet {
       public void changeParameters() {
           //меняются значения каких-то полей
           //далее вызов
           List list = DataManager.getInstance().getData();
           set(list);
           repaintAll();
      }
}


Далее пользователь может менять значения полей в главном классе, от которых зависит то, какая информация придет. И вот после того как он меняет значения полей, в основном потоке вызывается метод getData(), данные получаются, все нормально, но...

На некоторых компьютерах дочерний поток просто перестает существовать, никаких исключений, ничего, все глухо. При чем раньше все работало нормально, когда DELAY был равен 30 секундам... В чем проблема не понятно... Как найти ошибку, не понятно...
PM MAIL   Вверх
Keyo
Дата 10.4.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



кстати да, InterruptedException не происходит, равно как и другие Exception, поток тихо умирает. При чем даже в списке потоков в консоли JAVA его тоже нет :-( нид хелп. И происходит это выборочно, при чем до вызова getData из основного потока, все у всех работает нормально, а далее у некоторых поток пропадает стабильно, а у некоторых остается... ((
PM MAIL   Вверх
LSD
Дата 11.4.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



На кой черт вообще эта конструкция нужна?
Код

Thread.currentThread().interrupt();

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

1. Как ты определяешь, что нет InterruptedException, у тебя там стоит запись в лог?
2. У тебя там явно есть работа с сетью, которая может кидать IOException, там есть обработка ошибок и запись их в лог?


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


Шустрый
*


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

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



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

1. У меня там стоит перехват исключения с выводом в консоль 
2. есть все возможные обработки исключений
PM MAIL   Вверх
Keyo
Дата 11.4.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



кстати, правда выкидываются они в стэк... но сути не меняет, по скольку стэк чист... как попа младенца
Код

        try {
         //работа с соединением
        } catch (final FileNotFoundException ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        } catch (final IOException ex) {
            if(DEBUG_MESS) ex.printStackTrace();

        } catch (final java.security.AccessControlException ex) {
            if(DEBUG_MESS) ex.printStackTrace();
            MainFrame.showAlert(MainFrame.ALERT_ACCESS);
        } catch (final Exception ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        } finally {
            if(out != null) out.close();
            if(connection != null) connection.disconnect();
        }


Добавлено через 2 минуты и 3 секунды
а по первому, я там ставил обработку исключения, оно не вызывалось в процессе работы... только при перезагрузке страницы, когда дочерний поток в "спячке"
PM MAIL   Вверх
LSD
Дата 11.4.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Без полного кода сложно что-то сказать. Если бы в run() вылетал непойманный Exception, то это было бы видно в консоли. А так тут похоже нормальное завершение потока по выходу из run().

P.S. Здесь:
Код

        } finally {
            if(out != null) out.close();
            if(connection != null) connection.disconnect();
        }

может быть выкинут необработанный IOException.


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


Шустрый
*


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

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



LSD, но он ведь все равно в консоль идет ((( а в консоли ничего нет

Добавлено через 36 секунд
я понимаю если бы у меня стоял пустой обработчик исключений где-то, так ведь нет такого (
PM MAIL   Вверх
Keyo
Дата 11.4.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вобщем сделал так...

написал еще один класс наследующий Thread, он периодически проверяет инстанс DataManagera

и если тот ! DataManager.getInstance().isAlive тогда DataManager.createNewInstance

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


Leprechaun Software Developer
****


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

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



Пока я вижу только пустой (без вывода в консоль) catch (final InterruptedException ex). И честно говлря надоедает гадать, что же там все таки не так, не видя кода.


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


Шустрый
*


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

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



LSD, пожалуйста, вот код

Код

    public void run() {
        try {

            while (true) {


                Thread.sleep(DELAY * 1000);

                    if ((chartList == null) || (chartList.size() == 0)) {
                        break;
                    }
                    final ChartBar bar = chartList.getLast();

                    final Date d = dateFormat.parse(bar.getDate() + " " + bar.getTime() + ":00");

                    final List<String[]> list = getData(MainFrame.getPair(), MainFrame.getInterval(), d.getTime());

                    if (list.size() > 0) {

                        boolean delete_at_end = false;

                        if(bar.getTime().equals(list.get(0)[1])) {
                            chartList.removeLast();
                            delete_at_end = true;
                            if(list.size() > 1) chartList.remove(0, list.size() - 1);
                        } else {
                            chartList.remove(0, list.size());
                        }
                        
                        chartList.add(list, 0);
                        
                        int fromIndex = chartList.size() - list.size();
                        
                        IndicatorsList.getInstance().refresh(IndicatorsList.ALL, (delete_at_end)?AbstractIndicator.AT_END:AbstractIndicator.AT_BEGIN, fromIndex);

                        if (MainFrame.getShiftLeft() == 0) {
                            MainFrame.getInstance().repaintAll();
                        } else {
                            int shiftLeft = MainFrame.getShiftLeft();
                            shiftLeft = MainFrame.setShiftLeft(shiftLeft + list.size());
                            if (shiftLeft > chartList.size() - MainFrame.timebarCount) {
                                shiftLeft = chartList.size() - MainFrame.timebarCount;
                                MainFrame.setShiftLeft(shiftLeft);
                                MainFrame.getInstance().repaintAll();
                            }
                        }
                    }
            }
        } catch (final InterruptedException ex) {
            DataManager.currentThread().interrupt();
            if(DEBUG_MESS) ex.printStackTrace();
        } catch (final ParseException ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        } catch (final Exception ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        }
    }

    private static List<String[]> doPost(final String pair,
            final int interval, final long time) {

        LinkedList<String[]> list = new LinkedList<String[]>();
        PrintWriter out = null;
        HttpURLConnection connection = null;

        try {

            final String urlAddr = MainFrame.dataHost + MainFrame.dataPath;

            final URL url = new URL(urlAddr);

            connection = (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestMethod("GET");


            out = new PrintWriter(connection.getOutputStream());

            out.print("pair=");
            out.print(pair);
            out.print("&timeFrame=");
            out.print(interval);
            out.print("&time=");
            out.print(time);
            out.flush();

            Scanner in;
            try {
                in = new Scanner(connection.getInputStream());
            } catch (final IOException ex) {
                if (!(connection instanceof HttpURLConnection)) {
                    throw ex;
                }
                final InputStream err = ((HttpURLConnection) connection).getErrorStream();
                if (err == null) {
                    throw ex;
                }
                in = new Scanner(err);
                if (DEBUG_MESS) {
                    ex.printStackTrace();
                }
                MainFrame.showAlert(MainFrame.ALERT_CONN_ERR);
            }

            
            while (in.hasNextLine()) {
            
                final String s = in.nextLine();
                final String[] arr = s.split(delimiter);

                if (arr.length == 9) {
                    list.add(arr);
                }
            }

        } catch (final FileNotFoundException ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        } catch (final IOException ex) {
            if(DEBUG_MESS) ex.printStackTrace();

        } catch (final java.security.AccessControlException ex) {
            if(DEBUG_MESS) ex.printStackTrace();
            MainFrame.showAlert(MainFrame.ALERT_ACCESS);
        } catch (final Exception ex) {
            if(DEBUG_MESS) ex.printStackTrace();
        } finally {
            if(out != null) out.close();
            if(connection != null) connection.disconnect();
        }

        if (list.size() != 0) {
            MainFrame.hideAlert();
        } else if(list.size() == 0) {
            MainFrame.showAlert(MainFrame.ALERT_SERVER_ERR);
        }

        return list;
    }

    public static synchronized List<String[]> getData(final String pair,
            final int interval, final long time) {

        return doPost(pair, interval, time);
    }


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


Leprechaun Software Developer
****


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

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



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


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


Шустрый
*


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

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



LSD, к сожалению у меня на компе все работает без сбоев (( поэтому не уверен что под отладчиком выявится проблема, кроме того управление апплетом идет из вне, из javascript, может быть в этом проблема, из за этого трудно отлаживать, но опять таки все исключения ловятся без исключения (

Добавлено через 54 секунды
кроме того на всех компах офиса апплет работает, не работает выборочно и непонятно как... вот например у одного человека под шестым осликом с самым последним JRE... не работает... 
PM MAIL   Вверх
Keyo
Дата 12.4.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такой вопрос, дабы не плодить новую тему, как отформатировать Long, так чтобы скажем если число больше чем 10 в 9 степени, то выводилось что-то типа 10.0Е8
PM MAIL   Вверх
LSD
Дата 12.4.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Нет уж, один топик - один вопрос.


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


Шустрый
*


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

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



Цитата(LSD @  12.4.2008,  20:39 Найти цитируемый пост)
Нет уж, один топик - один вопрос. 

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

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

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


 




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


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

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