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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Connector.open тормозит главный поток, WTK 2.2 
V
    Опции темы
Gershkovich
Дата 23.10.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет!

Никто не замечал такой особенности WTK 2.2 ?
если запущен 1(один) поток который котнектиццо к Инету, то главный поток тормозит.
Причом конкретно тормозит.
Это выражается  в медленном открывании меню и медленном срабатывании кнопок (т.е. их лиснеров)

Имеется в виду тока WTK 2.2
На реальном девайсе не пробовал

На всяк. случай вот код потока:

Код

    public void run() {

        HttpConnection connection = null;
        DataInputStream is;

        try {

            sleep(1000);

            connection =
                    (HttpConnection) Connector.open(
                            getUri(),            // URL
                            Connector.READ,      // Mode
                            true);               // Timeout exception available

            connection.setRequestMethod(HttpConnection.GET);
            connection.setRequestProperty("Connection", "close");
            connection.setRequestProperty("Cache-Control", "no-transform");
            connection.setRequestProperty("Content-Length", "0");

            int rc = connection.getResponseCode();

            if (rc != HttpConnection.HTTP_OK) {

                // todo : Log error, throw IO exception
                throw new IOException("Http Error, response Code is " + rc);
            }

            is = connection.openDataInputStream();

            while (is.read() > 0) {
                // ignore incoming data
            }

            if (null != listener) {
                listener.notifyOk();
            }

        } catch (Exception ioe) {
            if (null != listener) {
                listener.notifyFailed();
            }

        } finally {

            System.out.println("Thread " + this.getName() + " finished");

            if (null != connection) {
                try {
                    connection.close();
                } catch (IOException e) {
                    // Supress exception
                }
            }
        }
    }




Причем лиснер срабатывает только после того как этот поток завершится.

Очень похоже на http://forum.vingrad.ru/topic-139944.html



Это сообщение отредактировал(а) Gershkovich - 23.10.2007, 18:43
PM MAIL   Вверх
VOS
Дата 24.10.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тоже задавался этим вопросом. Похоже, что в J2ME (по крайней мере во многих телефонах) используется не вытесняющая, а кооперативная многозадачность. Т.е. если при вытесняющей многозадачности потоку дается квант времени или определенное кол-во инструкций, которое выполняет проц и затем переключается на выполнение другого набора инструкций (другой поток), то в J2ME механизм как в Windows 3.1/3.11. Поэтому желательно периодически вызывать Thread.yield() особенно внутри всяких вычислительных циклах, чтобы дать отработать другим потокам. Подозреваю, что по этой причине отрисовка графики в J2ME синхронизирована  автоматом, в отличие от J2SE (например в Swing), где надо использовать некие механизмы, которые в конечном счете отправляют сообщение в основной граф. поток, чтобы именно он отрисовал что-то там. Иначе все может заглючить. А  в J2ME,  например, тот же  drawString выполняется по-любому атомарно, а значит не надо и синхронизировать или че-то там придумывать.

Соответственно если в какой-то даже системной функции нет периодического вызова Thread.yield()/аналога то все остальные потоки будут терпеливо ждать пока она отработает. Естественно при таком построении сложно обрабатывать большое кол-во потоков, возможно поэтому их кол-во ограничено (как об этом писал WOLF  и javastic).

Опять же, не факт что так оно и есть, но как-то похоже на то ;)
PM MAIL   Вверх
hamsterKSU
Дата 24.10.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня были такиеже глюки с конетом, но только когда адресс не существовал, он там очень долго пытался его найти. все это решилось показом экрана ожидания.
PM MAIL ICQ   Вверх
Gershkovich
Дата 24.10.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



hamsterKSU, у меня именно так. 
Тормоза наблюдаются именно если УРЛ по какой-то причине не доступен. 
Например у меня, фаервол блокировал порт.



VOS, Спасибо. Это, наверно,  единственное объяснение.
Жаль не могу протесировать с yield - зависает именно на вызове Connector.open(...



PS Тут мне народ подсказывает что на реальных телефонах всё вроде бы Ок.
Что глюки проявляются только на WTK.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

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


 




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


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

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