j2me новичок : передача данных между нитями, критикуйте
От: AlexMut Россия http://mut.ru
Дата: 20.10.09 10:18
Оценка:
Пишу мидлет GPRS чат.
есть класс form в ней будут лэйблами отображаться записи чата
по кнопке может открыться новая форма для отправки сообщения
(класс form он у меня многофункциональный и может быть вида info(инофрмация),message(ввод сообщения),chatroom(список сообщение) и settings(настройки: ник и прочее) определяется параметром конструктора)
есть отдельный класс connector он обеспечивает отправку сообщения и получение новых, работает в отдельной нити
есть класс storage хранилище данных: записей чата, никнейм, и т.д.
-----------------------------------------------
теперь нжна обратная связь
из form в storage (например сохранить настройки пользователя)
из connector в storage (добавить новые записи чата)
из connector в form(chatroom) обновить отображаемые записи
сейчас я делаю так
у меня в storage есть метод formfeedback(form f) который на входе имеет форму,
по типу формы я определю что требуется
есть тип формы settings то из формы я беру данные настроек и сохраняю storage
если тип формы message то порождаю новый connector в отдельной нити отправлющий сообщение и получающий новые
причем connector-у я передаю в конструктор форму f для того чтобы connector кода закончит работу мог тоже просигнализировать
storage через formfeedback(f)
покритикуйте\расскажите как делаете вы?
Re: j2me новичок : передача данных между нитями, критикуйте
От: Other Sam Россия  
Дата: 20.10.09 12:27
Оценка:
AM>Пишу мидлет GPRS чат.
AM>есть класс form в ней будут лэйблами отображаться записи чата
AM>по кнопке может открыться новая форма для отправки сообщения
AM>(класс form он у меня многофункциональный и может быть вида info(инофрмация),message(ввод сообщения),chatroom(список сообщение) и settings(настройки: ник и прочее) определяется параметром конструктора)
AM>есть отдельный класс connector он обеспечивает отправку сообщения и получение новых, работает в отдельной нити
AM>есть класс storage хранилище данных: записей чата, никнейм, и т.д.
AM>-----------------------------------------------
AM>теперь нжна обратная связь
AM>из form в storage (например сохранить настройки пользователя)
AM>из connector в storage (добавить новые записи чата)
AM>из connector в form(chatroom) обновить отображаемые записи
AM>сейчас я делаю так
AM>у меня в storage есть метод formfeedback(form f) который на входе имеет форму,
AM>по типу формы я определю что требуется
AM>есть тип формы settings то из формы я беру данные настроек и сохраняю storage
AM>если тип формы message то порождаю новый connector в отдельной нити отправлющий сообщение и получающий новые
AM>причем connector-у я передаю в конструктор форму f для того чтобы connector кода закончит работу мог тоже просигнализировать
AM>storage через formfeedback(f)
AM>покритикуйте\расскажите как делаете вы?

Я ничего не понял. Рассмотри вопросы:
1. можно ли обращаться к формам из других потоков (awt — можно, swing — нельзя, мидлеты — ???)
если можно — то значит прямо из потока connector можно дергать методы форм
если нельзя — то нужно как-то передать управление в поток, которому можно. В свингах это делается так
Runnable r = new Runnable(){
  public void run()
  {
    // Code to access your form
  }
};
javax.swing.SwingUtilities.invokeAndWait( r );


2. многопоточное приложение — всегда геморой. Посмотри внимательнее, возможно сможешь избавиться от многопоточности.
Re: j2me новичок : передача данных между нитями, критикуйте
От: Donz Россия http://donz-ru.livejournal.com
Дата: 20.10.09 15:39
Оценка:
Здравствуйте, AlexMut, Вы писали:

Сорри, врубаться в чужой метод под конец дня совсем не хочу. Так что просто скажу, как делаю я.
1)Стандартные контролы не используются из-за их убогости как в функционале, так и в виде
2)Есть две основных мои нити + одна опциональная. В качестве контроллера используется Canvas, то есть в мой унаследованный от Canvas класс приходят события нажатия кнопок, изменения размеров экрана, тыкание сенсорного экрана и т.д. По этим событиям я взвожу соответствующий флажок, обрамляя этот код synchronized, после чего пробуждаю нить, которая обрабатывает поступившее событие. В абсолютном большинстве случаев — это нажатие клавиши или тыкание сенсорного экрана. Пробужденная нить смотрит, какой флажок взведен, в synchronized блоке копирует его содержимое в свою переменную и производит соответствующие действия. После действий засыпает до следующей побудки. Возможно, что сигнализирует системной нити, что надо перейти в бэкграунд или перерисовать экран.
При определенных действиях надо начать сетевую активность, тогда моя нить, обрабатывающая нажатия клавиш, пробуждает нить сетевой активности. Плюс по логике моего приложения сетевая нить просыпается с переодичностью в 20-60 секунд, чтобы проверить, не надо ли чего принять/отослать.
Кроме этих нитей есть еще одна опциональная для действий с файловой системой. Работает по такому же принципу — первая нить проставила флажок, разбудила эту нить.
В общем, наверное, это называется событийная модель.

http://www.rsdn.ru/article/java/J2MEFirstSteps.xml
Автор(ы): Данилов Кирилл aka Donz
Дата: 15.03.2008
Cтатья призвана помочь обойти типичные ошибки, совершаемые при начале работы с платформой J2ME. Основной упор сделан на вещи, до которых автору пришлось доходить самому. Статья подразумевает знание языка Java и основных пакетов J2SE (java.lang.*, java.util.*, java.io.*), и касается в основном CLDC и MIDP.
— вот тут еще почитай, там тоже описано взаимодействие между нитями в J2ME.
Re[2]: j2me новичок : передача данных между нитями, критикуй
От: Donz Россия http://donz-ru.livejournal.com
Дата: 20.10.09 15:40
Оценка:
Здравствуйте, Other Sam, Вы писали:

OS>2. многопоточное приложение — всегда геморой. Посмотри внимательнее, возможно сможешь избавиться от многопоточности.


От одной собственной нити никак не избавится, так как выполнять в системной нити отрисовку объектов или другие ресурсоемкие операции нельзя.
Re[3]: j2me новичок : передача данных между нитями, критикуй
От: Other Sam Россия  
Дата: 20.10.09 17:37
Оценка:
OS>>2. многопоточное приложение — всегда геморой. Посмотри внимательнее, возможно сможешь избавиться от многопоточности.
D>От одной собственной нити никак не избавится, так как выполнять в системной нити отрисовку объектов или другие ресурсоемкие операции нельзя.

Незнаю как в j2me, но вставлять переключение потока между нажатием клавиши "А" и отрисовкой буквы "А" в инпут-боксе, мне кажется бессмысленным и расточительным.
Я не очень понимаю что такое "системная нить" и "одна собственная нить". Что это вообще?
Re[4]: j2me новичок : передача данных между нитями, критикуй
От: Donz Россия http://donz-ru.livejournal.com
Дата: 20.10.09 19:17
Оценка:
Здравствуйте, Other Sam, Вы писали:

OS>Незнаю как в j2me, но вставлять переключение потока между нажатием клавиши "А" и отрисовкой буквы "А" в инпут-боксе, мне кажется бессмысленным и расточительным.

OS>Я не очень понимаю что такое "системная нить" и "одна собственная нить". Что это вообще?
Системная нить — нить, в которой обрабатываются системные события: отрисовка экрана непосредственно на дисплей, начальная обработка нажатых клавиш, вызов конструктора мидлета и метода старта жизненного цикла мидлета и т.д. То есть, когда делается вызов, например, keyPressed( int keyCode ), то его содержимое как раз выполняется в системной нити. Если туда же запихать все действия по обработке этой клавиши вплоть до перерисовки экрана, можно словить глюки вплоть до зависания устройства.
Собственная нить — та, которую создал программист "вручную". Как раз в собственной нужно делать все трудоемкие операции. Отрисовка — это трудоемкая операция.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.