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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача параметра в событие, передача параметра в событие 
:(
    Опции темы
Artemon
Дата 13.9.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



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

В C# это можно сделать с помощью делегатов.
В C++ это можно сделать с помощью посылки сообщения WM_DATACOPY

А как это сделать в J2ME.

P.S.
    Чтобы было понятнее опишу задачу.
    
    Создается поток, который слушает TCP/IP порт, ка только прихлдят данные - он их выводит на экран.




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Antropoid
Дата 13.9.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Запускаешь тред, который будет слушать порт. В J2ME метод прослушки блокирующий, т.е. тред сам на нем остановица, а как только шота придет, - о проснеца ну и выведет тебе чего нада на экран.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
javastic
Дата 14.9.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Artemon, вот тебе простой пример из WTK, там совершенно не надо использовать события:

Код

            si.setText("Waiting for connection");
            scn = (ServerSocketConnection) Connector.open("socket://:5000");

            // Wait for a connection.
            sc = (SocketConnection) scn.acceptAndOpen();  //ТУТ ПОТОК БУДЕТ ЖДАТЬ КОНЕКШЕН!!!!
            si.setText("Connection accepted");
            is = sc.openInputStream();
            os = sc.openOutputStream();
            sender = new Sender(os);

            // Allow sending of messages only after Sender is created
            f.addCommand(sendCommand);

            while (true) {
                StringBuffer sb = new StringBuffer();
                int c = 0;

                while (((c = is.read()) != '\n') && (c != -1)) {
                    sb.append((char) c);
                }

                if (c == -1) {
                    break;
                }
                si.setText("Message received - " + sb.toString());
            }


это всё в методе run() надо прописывать. Учти что код неполный, я просто в комментарии указал как это работает


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
W0LF
Дата 14.9.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата(Artemon @  13.9.2007,  17:25 Найти цитируемый пост)
Создается поток, который слушает TCP/IP порт, ка только прихлдят данные - он их выводит на экран.

Посмотри в WTK есть пример
\\WTK\apps\NetworkDemo\src\socket\
Класс Client или Server.
там замечательно описано как создать поток и слушать сокет.
А в классе Sender нормально показано как отправлять и при этом сделать нормальную синхронизацию

Добавлено через 4 минуты и 45 секунд
гг, 
javastic, быстрее успел smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Artemon
Дата 18.9.2007, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Работа с сетью - это частный случай.

Я хотелбыв узнать вообще про общую идею.

Поворю вопрос:

Как вызвать событие в основном потоке из дополнительного?



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
W0LF
Дата 18.9.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата(Artemon @  18.9.2007,  06:26 Найти цитируемый пост)
Работа с сетью - это частный случай

Почему это частный случай??? 
Опиши конкретнее че тебе надо.


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Artemon
Дата 18.9.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Частный - потомучто решает конкретную задачу.

Еще раз поворю вопрос:

Допустим у нас крутятся 2 потока:
1. Основной
2. Дополнительный.

В дополнительном потоке выполняется лишь одна операция:

Код

int Val = 0;
while(true)
        {
         Val ++;
        }


Я хочу чтобы через каждые 5 итераций управление переходило в основной поток.
P.S.
     Переменную Val - нельзя выносить из дополнительного потока.


Это сообщение отредактировал(а) W0LF - 18.9.2007, 13:21


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
W0LF
Дата 18.9.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



1. Что такое основной поток? это поток приложения??
2. Что значит переходило управление?? это наверно надо первый поток приостановить сначала чтоб потом к нему переходило управление. многопоточность для того и служит чтоб потоки работали параллельно
Я правильно понял? если так, то тогда могу и пример набросать. но в этом случае пример сети как раз нормально подходит


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Dancer
Дата 18.9.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



ну а теперь смотрим в сторону wait() и notify()
вызываем wait() через пять циклов, и делаем notify() на объекте твоего "основного" потока.

Код

public MyClass implements Runnable {
    private Thread fatherThread=null;
    private int val = 0;

    MyClass(Thread t) {
        fatherThread = t;
    }

....
public void run() {
    while(true) {
        if( ((val)%5) ==0 ) {
            fatherThread.notify();
            wait();
        }
        val++;
    }
}

    public int getValue() {
        return val;
    }
}




Это сообщение отредактировал(а) W0LF - 18.9.2007, 14:19


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Artemon
Дата 18.9.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Набросай, если не сложно


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
W0LF
Дата 18.9.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Писал навскидку, мож дет и натупил..
Код

final Object monitor1 = new Object();
final Object monitor2 = new Object();        
        Thread thread1 = new Thread() {
            int val1 = 0;
            public void run() {


                while (true) {
                    System.out.println("thread1 is working");
                    if (((val1) % 5) == 0) {
                        System.out.println("thread2 will be work");
                        synchronized (monitor2) {
                            monitor2.notify();
                        }
                        try {
                            System.out.println("thread1 will be stop");
                            synchronized (monitor1) {
                                monitor1.wait();
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }

                    val1++;

                }

            }
        };
        thread1.start();

        Thread thread2 = new Thread() {
            int val2 = 0;
            public void run() {

                try {
                    System.out.println("thread2 is not working now");
                    synchronized (monitor2) {
                        monitor2.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                while (true) {
                    System.out.println("thread2 is working");
                    if (((val2) % 5) == 0) {
                        System.out.println("thread1 will be work");
                        synchronized (monitor1) {
                            monitor1.notify();
                        }
                        try {
                            System.out.println("thread2 will be stop");
                            synchronized (monitor2) {
                                monitor2.wait();
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }

                    val2++;

                }

            }
        };
        thread2.start();

В общем у нас создаются два потока. второй сразу останавливается. Начинает работать первый, када доходит до инта делимого на 5 останавливается и запускает второй поток, тот в свою очередь делает то же - 5 итераций, остановился, запустил первый.
Может я тебя неправильно понял конечно smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Artemon
Дата 19.9.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



".notify();" - вот это я и пытался из вас выудить!!!!

Итак, вопрос решен но на половину.

Осталось только узнать как например передать переменную через notify() ???

Например:  notify("String value")



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Artemon
Дата 19.9.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Сейчас попробовал из вторичного потока обратиться к графическим компонентам основного потока и я не получил никакого исключения.

в J2ME можно напрямую обращаться к компонентам формы из вторичных потоков???


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
javastic
Дата 20.9.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Я начинаю понимать что я ничего не понимаю.  smile 


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
W0LF
Дата 20.9.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата(Artemon @  19.9.2007,  14:43 Найти цитируемый пост)
в J2ME можно напрямую обращаться к компонентам формы из вторичных потоков??? 

Да, это баг j2me я бы сказал smile
обычно этого делать низя, но в j2me можно. И через notify параметр не передашь. Храни его дето в модели. перед notify измени его там. А другой поток када проснеццо пусть заберет его из модели. и не забывай про синхронизацию. или же ставь спец. доступа переменной volatile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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