Модераторы: 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   Вверх
Shurik16
Дата 8.12.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вариант отловить ошибку не получается ошибок нет. Приоритеты ему тоже фиолетовы. А насчет эмуляторов я использую изначально  Nokia  S60_2nd_FP2_MIDP_SDK_J.
PM MAIL ICQ Skype   Вверх
eugine_s
Дата 8.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shurik16 @  8.12.2007,  13:56 Найти цитируемый пост)
Вариант отловить ошибку не получается ошибок нет


Такого не может быть.
Ошибка все равно где-то должна всплыть.

Тогда выводи на экран все этапы работы мидлета и смотри где останавливается (подвисает) поток.

Например, на экран выводить на экран: 
Поток 1 запущен
Поток 2 запущен 
Поток 1 обновление
Поток 2 prefetch()
Поток 2 setLoopCount(10)
Поток 2 start() мелодии 

(Все эти сообщения можно записывать в public static Vector, а из вектора делать цикл по отрисовке содержимого на экране).


Если уже не получается, то бросай сюда исходники полностью с вариантом где ты отлавливаешь ошибку.
PM MAIL   Вверх
Shurik16
Дата 8.12.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код программы: 

Код

/*
 * CrMo.java
 *
 * Created on 17 Апрель 2007 г., 22:43
 */
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.media.*;    
import java.io.*;
import java.util.*;
import com.nokia.mid.ui.FullCanvas;


/**
 * An example MIDlet with simple "Hello" text and an Exit command.
 * Refer to the startApp, pauseApp, and destroyApp
 * methods so see how each handles the requested transition.
 *
 * @author  (C@8:
 * @version
 */
 public class CrMo extends MIDlet                   
 {
    
    private Command exitCommand;  // The exit command
    private Display display;      // The display for this MIDlet
    public static String error;

           
    mendraw m = new mendraw();   //Создание подкласса mendraw
    zastavka z = new zastavka(); //создание заставки

     
    

    Thread thread;      
    Thread thread_1;// Переменная типа процес
    Image image,image1;                // Переменная типа картинка
    int index = 0,h,w;       
 
   
      
    
    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(z); // Сразу после загрузки мидлета переходит на класс mendraw        
    }
////////////////////////////////////////////////////////////////////////////////
// Заставка ====================================================================  
    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;
            }
             if (error != null) {    
           g.setColor(0x00FFFF); //любой цвет    
           g.drawString(error, 40, 95, Graphics.HCENTER | Graphics.TOP);}
            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.setPriority(Thread.MIN_PRIORITY);
        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){error = e.toString();}
            }             
        }          
        public void keyPressed(int KeyCode) {
            index=1;
            thread=null;
            thread_1=null;
            display.setCurrent(m);
        }
        
       
        
    }
////////////////////////////////////////////////////////////////////////////////
// Меню ========================================================================   
    class mendraw extends FullCanvas implements PlayerListener
     
    {
        
        public void paint(Graphics g) {
          h = getHeight();
          w = getWidth();
          
            setImage(g,"/menu.png",0,0);
            //setImage(g,"/menu_rus.png",55+5,35+5);      
            
            
            g.setColor(0, 0, 0); //Задаем цвет прямоугольников меню
            g.drawRoundRect(40, 70  ,96,15,10,10);
            g.drawRoundRect(40,70+25,96,15,10,10);
            g.drawRoundRect(40,70+50,96,15,10,10);
            g.drawRoundRect(40,70+75,96,15,10,10);
            g.drawRoundRect(40,70+100,96,15,10,10);
            
            
            g.setColor(128, 64, 0);
            g.drawString("Игра", 88, 71, g.TOP | g.HCENTER); // Рисуем первую строку меню
            g.drawString("Настроики", 88, 71+25, g.TOP | g.HCENTER); // Рисуем второю строку меню
            g.drawString("Справка", 88, 71+50, g.TOP | g.HCENTER); // Рисуем четвертую строку меню
            g.drawString("О программе", 88+1, 71+75, g.TOP | g.HCENTER); // Рисуем пятую строку меню
            g.drawString("Выход", 88, 71+100, g.TOP | g.HCENTER); // Рисуем шестую строку меню
            
            if (index == 1) { // Если индекс равен 1
                g.setColor(128, 64, 0);
                g.fillRoundRect(40,70,96,15,10,10); //Заливаем прямоугольник №1
                g.setColor(255, 255, 0);
                g.drawString("Игра", 88, 71, g.TOP | g.HCENTER); // Рисуем первую строку меню
            }
            if (index == 2) { // Если индекс равен 2
                g.setColor(128, 64, 0);
                g.fillRoundRect(40,70+25,96,15,10,10); //Заливаем прямоугольник№2
                g.setColor(255, 255, 0);
                g.drawString("Настроики", 88, 71+25, g.TOP | g.HCENTER); // Рисуем второю строку меню
            }
            
            if (index == 3) { // Если индекс равен 3
                g.setColor(128, 64, 0);
                g.fillRoundRect(40,70+50,96,15,10,10); //Заливаем прямоугольник №4
                g.setColor(255, 255, 0);
                g.drawString("Справка", 88, 71+50, g.TOP | g.HCENTER); // Рисуем четвертую строку меню
            }
            if (index == 4) { // Если индекс равен 4
                g.setColor(128, 64, 0);
                g.fillRoundRect(40,70+75,96,15,10,10); //Заливаем прямоугольник №5
                g.setColor(255, 255, 0);
                g.drawString("О программе", 88+1, 71+75, g.TOP | g.HCENTER); // Рисуем пятую строку меню
              
            }
            if (index == 5) { // Если индекс равен 5
                g.setColor(128, 64, 0);
                g.fillRoundRect(40,70+100,96,15,10,10); //Заливаем прямоугольник №6
                g.setColor(255, 255, 0);
                g.drawString("Выход", 88, 71+100, g.TOP | g.HCENTER); // Рисуем шестую строку меню
            }
        } 
      
       
        public void keyPressed(int KeyCode) {
           
              int press = KeyCode; //Заносим в переменную код нажатой кнопки
                             
            if (press == -5) { //Усли нажата кнопка OK
                
                if (index == 1){
                index=0;  
                 display.setCurrent(g);
                }
                if (index == 2){          
                 
                }
                if (index == 3){
                // display.setCurrent(h);
                }
                if (index == 4){
                // display.setCurrent(a);
                }
                if (index == 5){
                 destroyApp(true);
                 notifyDestroyed();
                }
                           
            }
            
            if (press == -2) { //Усли нажата кнопка DOWN
                if (index > 4) {
                    index = 1;
                }
                else {
                    index++; // Перемещаем прямоугольники вниз
                }
                repaint(); //Прорисовываем изменения
            }
            if (press == -1) { //Усли нажата кнопка UP
                if (index < 2) {
                    index = 5;
                }
                else {
                    index--; // Перемещаем прямоугольники вверх
                }
                repaint(); //Прорисовываем изменения
            }
        }     
        
        public void playerUpdate(javax.microedition.media.Player player, String str, Object obj) {
        }        
       
        
   }
////////////////////////////////////////////////////////////////////////////////

    
    public void pauseApp() {}    
    public void destroyApp(boolean unconditional) {}
    
   
    public void commandAction(Command c, Displayable s) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }
    }
////////////////////////////////////////////////////////////////////////////////
  private class so extends Thread {
   public void run(){
       error="поток Запущен";
       ru();   
  }
   public void ru(){
    try {
       InputStream is = getClass().getResourceAsStream("intro.wav");
    Player p = Manager.createPlayer(is, "audio/x-wav");
    error="Плэир создан";
    p.prefetch();
    error="p.prefetch(); создан";
    p.setLoopCount(10);
    error="p.setLoopCount(10); создан";
    p.start();  
    error="p.start; создан";
    try { thread.sleep(100);} catch (InterruptedException e){error = e.toString();}
    }catch (IOException ex) {error = ex.toString();}
        catch (MediaException ex) {error = ex.toString();}
  
   }} 
  
////////////////////////////////////////////////////////////////////////////////
// Вставка картинки=============================================================

    public void setImage(Graphics g,String path,int x1,int y1){
        try{
            image = Image.createImage(path);
        } catch (IOException ioe) {System.out.println("bed :( "+ioe.getMessage()); }
        g.drawImage(image,x1,y1,Graphics.LEFT | Graphics.TOP);
       
    }
////////////////////////////////////////////////////////////////////////////////

    
      
}


Не могу понять на эмуляторе правильно работает а на телефоне тупит  smile .
Когда пытался отловить ошибку он вроде бы правильно работает потоки запускаются, а музыка не играет.

PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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