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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в J2ME. Ошибка запуска потока. 
:(
    Опции темы
alex111
Дата 28.11.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть код:

if (!BTThread.isAlive())     //BTThread — поток
{
          BTThread.start();
}

Выбрасывается ошибка, типа поток уже запущен.
Почему это может происходить и как этого можно избежать?
PM MAIL   Вверх
eugine_s
Дата 28.11.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Цитата(alex111 @  28.11.2007,  14:03 Найти цитируемый пост)
Выбрасывается ошибка, типа поток уже запущен


Весь текст ошибки приведи из консоли.
PM MAIL   Вверх
javastic
Дата 28.11.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



alex111, Да потому что пвторно уже запущенный поток нельзя запускать =)
Ты его можешь приостановить, оживить или прибить  smile 


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


Новичок



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

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



Ошибка: IllegalThreadStateException.

Возможно, она возникает из-за того, что я пытаюсь повторно запустить отработавший поток, т.е. каждый раз надо создавать новый поток?
PM MAIL   Вверх
javastic
Дата 28.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А як же ты ещё хотел? Если тебе его нужно несколько раз вызывать при определённых событиях то в методе run сделай цикл, затем в потоке у тебя что-то выполняется, а затем делаешь ему wait. потом где нужно вызывай notify и он проснётся и выполнится ещё раз и опять уснёт. Можешь в цикл поставить условие с помощью которого цикл будет завершаться и поток будет отрабатывать последний раз.


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


Новичок



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

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



Способ wait/notify принял.

Ещё вопрос:
Что происходит, когда мы вызываем оператор new для работающего потока?
Или лучше всё-таки, в случае его работы, останавливать его, а потом уже создавать новый?
PM MAIL   Вверх
javastic
Дата 28.11.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Каждый метод new создает новый эксземпляр класса. Какие ещё могут быть вопросы?


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


Новичок



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

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



Да, но что происходит со старым потоком, если он в это время запущен: отрабатывает он до конца или прекращает своё выполнение.
Мы первый раз вызвали Thread1 = new Thread, запустили его, потом хотим ещё раз вызвать Thread1 = new Thread().
PM MAIL   Вверх
W0LF
Дата 28.11.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



Цитата(alex111 @  28.11.2007,  14:39 Найти цитируемый пост)
Да, но что происходит со старым потоком, если он в это время запущен: отрабатывает он до конца или прекращает своё выполнение.

а чего бы это ему вдруг закончить работу? smile

Цитата(alex111 @  28.11.2007,  14:39 Найти цитируемый пост)
Мы первый раз вызвали Thread1 = new Thread, запустили его, потом хотим ещё раз вызвать Thread1 = new Thread().

вот те пример, безымянный класс - 
Код

new Thread(){
            public void run() {
                while(true) {
                    System.out.println("I'll be back. hehe");
                }
            }
        }.start();

и он будет работать, хотя и ссылки на него нет smile


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


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.4.2007
Где: г.Хабаровкс

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



Вопрос:
А возможно использовать два и более потока одновременно, если да то в чем моя ошибка?
Код

// Заставка ====================================================================  
    class zastavka extends FullCanvas 
    implements  Runnable
    {       
        int i1=255,i2=0,i3=0,index_color=1;
        public void paint(Graphics g) {
            if (index==0) { 
            Start_run();
            setImage(g,"/start.png",0,0);
            index=1;
            }
            g.setColor(i1, i2, i3);
            g.drawString("Please press a key",88,190,Graphics.HCENTER | Graphics.TOP);
                        
        }
        public void Start_run() {  
        thread=null;
        thread = new Thread(this);
        so thread_1 = new so(); 
        thread_1.start();
        thread.start();
        repaint();
        }
         
        public void run() {
                
            while (index!=4){
                if (index_color==1) {     
                 if (i2!=255){
                    i2++;} else {index_color=2;}                 
                }                     
                if (index_color==2) {     
                 if (i1!=0){
                    i1--;} else {index_color=3;}                 
                }                     
                if (index_color==3) {      
                 if (i3!=255){
                    i3++;} else {index_color=4;}                 
                }                     
                if (index_color==4) {     
                 if (i2!=0){
                    i2--;} else {index_color=5;}                 
                }                     
                if (index_color==5) {     
                 if (i1!=255){
                    i1++;} else {index_color=6;}                 
                }     
                if (index_color==6) {     
                 if (i3!=0){
                    i3--;} else {index_color=1;}                 
                }                     
              repaint();
             try{ thread.sleep(0);} catch (InterruptedException e){}
            }             
        }          
        public void keyPressed(int KeyCode) {
            index=1;
            thread=null;
            thread_1=null;
            display.setCurrent(m);
        }        
    }
////////////////////////////////////////////////////////////////////////////////
 private class so extends Thread {
   public void run(){
       ru();   
  }
   public void ru(){
    try {
       InputStream is = getClass().getResourceAsStream("intro.wav");
    Player p = Manager.createPlayer(is, "audio/x-wav");
    p.prefetch();
    p.setLoopCount(10);
    p.start();  
    try { thread.sleep(300);} catch (InterruptedException e){}
    }catch (IOException ex) {}
        catch (MediaException ex) {}
  
   }}

О коде,  заставка с переливающейся надписью и звук. По  отдельности работает, а вместе нет. 
PM MAIL ICQ Skype   Вверх
W0LF
Дата 7.12.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



Че пишет?


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


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.4.2007
Где: г.Хабаровкс

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



В том и дело компилирует нормально эмулятор тоже работает правильно скидываю на телефон N70 Только надпись мигает.
PM MAIL ICQ Skype   Вверх
W0LF
Дата 7.12.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


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

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



Не, ну это понятно. ты можешь заполнить все пустые блоки исключений?
Типа так - 
Код

try {
       InputStream is = getClass().getResourceAsStream("intro.wav");
    Player p = Manager.createPlayer(is, "audio/x-wav");
    p.prefetch();
    p.setLoopCount(10);
    p.start();  
    try { thread.sleep(300);} catch (InterruptedException e){e.printStackTrace();}
    }catch (IOException ex) {ex.printStackTrace();}
        catch (MediaException ex) {ex.printStackTrace();}

А потом посмотришь че там пишет


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


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.4.2007
Где: г.Хабаровкс

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



Я проверил с таким вариантом но не понял где смотреть WT25 в консоли пусто а в телефоне вроде бы нечего не выдало. Я уже недели бьюсь как об стенку. На заставке не играет звук а как переходит в меню проигрывает . Может там очередность или приоритеты.  
PM MAIL ICQ Skype   Вверх
eugine_s
Дата 7.12.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Эмулятор не дает гарантии правильности работы на телефоне, тем более эмулятор от Sun. Если хочешь, чтобы эмулятор более похожий результат давал для твоего телефона зайди на http://forum.nokia.com и там скачай эмулятор для Java S60.

Попробуй на процес отрисовки поставить минимальный приоритет.

Код

thread.setPriority(Thread.MIN_PRIORITY);


Если не поможет, то создай где-то 

Код

public static String error;


и везде в catch() блоках ставь

Код

try
{

} catch (Exception e)
{
error = e.toString();
}


а в методе paint() выводи строку:

Код


public void paint(Graphics g)
{ 
 if (error != null)
 { 
   g.setColor(0x00FFFF); //любой цвет
   g.drawString(error, 0, 0, 0);
}


Вообщем суть такая: на телефоне появляется ошибка, которой на эмуляторе не было, у телефона нет System.out потока, т.е. некуда выводить текст, поэтому нужно отловить ошибку (что и делается в try-catch блоках), запомнить эту ошибку (это мы делаем, записав ошибку в error) и вывести эту ошибку на экран(это делается в paint()-е).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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