Пишу мидлет 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 новичок : передача данных между нитями, критикуйте
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 новичок : передача данных между нитями, критикуйте
Сорри, врубаться в чужой метод под конец дня совсем не хочу. Так что просто скажу, как делаю я.
1)Стандартные контролы не используются из-за их убогости как в функционале, так и в виде
2)Есть две основных мои нити + одна опциональная. В качестве контроллера используется Canvas, то есть в мой унаследованный от Canvas класс приходят события нажатия кнопок, изменения размеров экрана, тыкание сенсорного экрана и т.д. По этим событиям я взвожу соответствующий флажок, обрамляя этот код synchronized, после чего пробуждаю нить, которая обрабатывает поступившее событие. В абсолютном большинстве случаев — это нажатие клавиши или тыкание сенсорного экрана. Пробужденная нить смотрит, какой флажок взведен, в synchronized блоке копирует его содержимое в свою переменную и производит соответствующие действия. После действий засыпает до следующей побудки. Возможно, что сигнализирует системной нити, что надо перейти в бэкграунд или перерисовать экран.
При определенных действиях надо начать сетевую активность, тогда моя нить, обрабатывающая нажатия клавиш, пробуждает нить сетевой активности. Плюс по логике моего приложения сетевая нить просыпается с переодичностью в 20-60 секунд, чтобы проверить, не надо ли чего принять/отослать.
Кроме этих нитей есть еще одна опциональная для действий с файловой системой. Работает по такому же принципу — первая нить проставила флажок, разбудила эту нить.
В общем, наверное, это называется событийная модель.
Здравствуйте, Other Sam, Вы писали:
OS>2. многопоточное приложение — всегда геморой. Посмотри внимательнее, возможно сможешь избавиться от многопоточности.
От одной собственной нити никак не избавится, так как выполнять в системной нити отрисовку объектов или другие ресурсоемкие операции нельзя.
Re[3]: j2me новичок : передача данных между нитями, критикуй
OS>>2. многопоточное приложение — всегда геморой. Посмотри внимательнее, возможно сможешь избавиться от многопоточности. D>От одной собственной нити никак не избавится, так как выполнять в системной нити отрисовку объектов или другие ресурсоемкие операции нельзя.
Незнаю как в j2me, но вставлять переключение потока между нажатием клавиши "А" и отрисовкой буквы "А" в инпут-боксе, мне кажется бессмысленным и расточительным.
Я не очень понимаю что такое "системная нить" и "одна собственная нить". Что это вообще?
Re[4]: j2me новичок : передача данных между нитями, критикуй
Здравствуйте, Other Sam, Вы писали:
OS>Незнаю как в j2me, но вставлять переключение потока между нажатием клавиши "А" и отрисовкой буквы "А" в инпут-боксе, мне кажется бессмысленным и расточительным. OS>Я не очень понимаю что такое "системная нить" и "одна собственная нить". Что это вообще?
Системная нить — нить, в которой обрабатываются системные события: отрисовка экрана непосредственно на дисплей, начальная обработка нажатых клавиш, вызов конструктора мидлета и метода старта жизненного цикла мидлета и т.д. То есть, когда делается вызов, например, keyPressed( int keyCode ), то его содержимое как раз выполняется в системной нити. Если туда же запихать все действия по обработке этой клавиши вплоть до перерисовки экрана, можно словить глюки вплоть до зависания устройства.
Собственная нить — та, которую создал программист "вручную". Как раз в собственной нужно делать все трудоемкие операции. Отрисовка — это трудоемкая операция.