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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread и Command 
:(
    Опции темы
satellite
Дата 7.2.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем. Простой пример :
Код

public class Midlet extends MIDlet implements CommandListener
{
    Display display;
    Form Form;
    Command C, B;
    public void startApp() 
    {
        display = Display.getDisplay(this);
        Form = new Form("Form");
        C = new Command("START", Command.OK, 1);
        B = new Command("BACK", Command.OK, 1);
        Form.addCommand(C);
        Form.addCommand(B);
        Form.setCommandListener(this);
        display.setCurrent(Form);
     }
    public void pauseApp() 
    {
    }
    
    public void destroyApp(boolean unconditional) 
    {
    }

    public void commandAction(Command command, Displayable displayable) 
    {
        if (command == C)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread thread = new Thread();
                try {
                    thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                Form.append("hello");
            }
        }
        else if (command == B)
        {
           System.out.println("YES");
        }
    }
}


Во время выполнения цикла команда B не работает. Как только цикл заканчивается - начинает работать.  Почему не работает в цикле? из-за Треда?
Просто необходимо выводить на экран строки через определенные промежутки времени, при этом имея возможность выхода в другое меню. Промежутки времени делаю через Thread, как по другому не знаю )))
PM MAIL   Вверх
Sardar
Дата 7.2.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Нельзя в треде обработчика событий выполнять долгие операции, это справедливо даже для десктопа. Создай новый тред и там выполняй работу. Пока не выйдешь из метода, другие события будут лежать в очереди.

Пауза жуть, многое видал, но что бы так... smile
Thread.currentThread().sleep(...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
W0LF
Дата 7.2.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



Начнемс =)

Form.setCommandListener(this) - значит, что ты на свою форму установил текущий commandAction, который переопределил здесь.
commandListener - это листенер главного потока приложения. commandAction - его метод
Далее - 
жмякаем на "START", происходит следующее - 
запускается цикл, в нем - создается поток, он не стартует, его я так понял ты юзаешь только для вызова sleep(1000)
Но если мы глянем в мануал, то увидим, что sleep() - статик метод класса Thread =) , то етсь вызвать мона так - Thread.sleep(1000);
Идем дальше - этим своим циклом ты вешаешь главный поток приложения - то есть пока цикл не отработает - никакая другая кнопка не нажмеццо!
Если честно - то я ваще непонимаю, зачем этот цикл нужен, но если так хочеццо, то я помогу =)
Переделанный код :

Код

public class Midlet extends MIDlet implements CommandListener
{
    Display display;
    Form Form;
    Command C, B;
    public void startApp() 
    {
        display = Display.getDisplay(this);
        Form = new Form("Form");
        C = new Command("START", Command.OK, 1);
        B = new Command("BACK", Command.OK, 1);
        Form.addCommand(C);
        Form.addCommand(B);
        Form.setCommandListener(this);
        display.setCurrent(Form);
     }
    public void pauseApp() 
    {
    }
    
    public void destroyApp(boolean unconditional) 
    {
    }
    public void commandAction(Command command, Displayable displayable) 
    {
        if (command == C)
        {
            Thread myThread = new MyThread(Form);
            myThread.start();
        }
        else if (command == B)
        {
           System.out.println("YES");
        }
    }
}

public class MyThread extends Thread {
    private void Form form;
    public MyThread (Form form) {
        this.form = form;
    }

    public void run() {
            for (int i = 0; i < 10; i++)
            {                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                form.append("hello");
            }
    }
}

Попробуй - должно работать теперь smile
Ну а ваще не принято из другого потока менять гуй. j2me это разрешает, но вот например технология blackBerry - нет!

Это сообщение отредактировал(а) W0LF - 7.2.2008, 18:26


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


Новичок



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

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



Цитата

Если честно - то я ваще непонимаю, зачем этот цикл нужен


В цикле я хочу отображать строки (предложения) на экране, допустим, из массива, но суть не в этом. Каждая строка должна появляться через определенное время. Допустим, 1-я через 2000 мсек, 2-я через 3250 мсек и т.д. Т.е. мне нужны паузы перед отображением.

Цитата

Пауза жуть


Подскажи как сделать паузу корректно, если можешь.

Ребята очень благодарен, что откликнулись.
PM MAIL   Вверх
Sardar
Дата 8.2.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(satellite @  7.2.2008,  21:28 Найти цитируемый пост)
Т.е. мне нужны паузы перед отображением.

Если строк мало (3 - 5 штук), то можешь  создавать новый тред для каждой строки, жизнь которого это Thread.sleep() и что нибудь  полезное, без цикла. Если строк много, то создай один worker thread с очередью, типичная producer/consumer задача. Во втором случае не забудь synchronized(список) { добавить/взять строку }.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
satellite
Дата 8.2.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть одна книга по J2ME, ее автор пишет, что если запустить такой код:

Код

public void startApp() 
    {
        SecondThread thread = new SecondThread();
        thread.start();
        for (int i = 1; i <= 5; i++)
        {
            System.out.println("Main Thread: " + i);
        }
    }

public class SecondThread extends Thread
{
    public void run()
    {
        for (int i = 1; i <= 5; i++)
        {
            System.out.println("Second Thread: " + i);
        }
    }
}


то результат будет такой:
     Main Thread: 1
     Second Thread: 1
     Main Thread: 2
     Second Thread: 2
     Main Thread: 3
     Second Thread: 3
     Main Thread: 4
     Second Thread: 4
     Main Thread: 5
     Second Thread: 5

Т.е. он хотел сказать, что второй поток работает одновременно с главным. На деле получается что сначала отрабатывает MainThread, а потом SecondThread. Неужели он ошибается?
PM MAIL   Вверх
W0LF
Дата 11.2.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



На деле, получается, что
Main Thread: 1
Second Thread: 1
Second Thread: 2
Second Thread: 3
Second Thread: 4
Second Thread: 5
Main Thread: 2
Main Thread: 3
Main Thread: 4
Main Thread: 5
Вот это на деле у меня, а вот как будут распределятся потоки - это уж предвидеть сложно
А работать они будут - параллельно


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

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

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


 




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


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

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