Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Thread и Command


Автор: satellite 7.2.2008, 16:47
Привет всем. Простой пример :
Код

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, как по другому не знаю )))

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

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

Автор: W0LF 7.2.2008, 18:22
Начнемс =)

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 - нет!

Автор: satellite 7.2.2008, 22:28
Цитата

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


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

Цитата

Пауза жуть


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

Ребята очень благодарен, что откликнулись.

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

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

Автор: satellite 8.2.2008, 23:16
У меня есть одна книга по 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. Неужели он ошибается?

Автор: W0LF 11.2.2008, 11:16
На деле, получается, что
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
Вот это на деле у меня, а вот как будут распределятся потоки - это уж предвидеть сложно
А работать они будут - параллельно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)