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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему приостанавливается Главный тред? 
:(
    Опции темы
Antropoid
Дата 6.3.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пусть есть код
Код

if(CMD_CONNECT) {
    System.out.println("CMD_CONNECT 1");

    new Thread() {
        public void run() {
            SocketConnection socketConnection = (SocketConnection)Connector.open("socket://" + serverHost + ":" + serverPort));
        }    
    }.start();

         for(int i=0;i<1024*1024;i++)
        System.out.println("CMD_CONNECT 2" + i);
}


Главный тред, обрабатывающий нажатия на кнопки девайса, должен запустить второй тред, соединяющийся по TCP с сервером. Если сервер долго не отвечает, то второй тред должен подвиснуть на Connector.open(...);, а Главный пойти дальше.
Вопрос:
А почему, собственно, Главный тред дальше идет только тогда, когда  второй тред решит, что соединение не может быть установлено?


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


alexander lonsky
***


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

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



1. Как у тебя это компилится??
Цитата

ublic static Connection open(String name)
                       throws IOException

IOException - это checked exception!

Добавлено @ 14:54 
Цитата

Главный тред, обрабатывающий нажатия на кнопки девайса, должен запустить второй тред, соединяющийся по TCP с сервером. 

Так и происходит!

Цитата

Если сервер долго не отвечает, то второй тред должен подвиснуть на Connector.open(...);, а Главный пойти дальше.

При чем тут отвечает он или нет????? Главный поток сразу же идет дальше!Он запустил второй и сразу же влез в твой цикл!
Цитата

Вопрос:
А почему, собственно, Главный тред дальше идет только тогда, когда  второй тред решит, что соединение не может быть установлено? 

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


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


Опытный
**


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

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



Код

//где-то глобально объявляем, а то нету никакого смысла получать коннекш черзе open()
// и тут же закончив поток, потерять этот самый установленный коннекшн.
SocketConnection socketConnection=null;
....
if(CMD_CONNECT) {
    System.out.println("CMD_CONNECT 1");

    new Thread() {
        public void run() {
            try {
                socketConnection = (SocketConnection)Connector.open("socket://" + serverHost + ":" + serverPort));
            } catch(Throwable t) {
                 socketConnection = null;
                 System.out.println("Error occured during connection to HOST["+serverHost+"]: "+t);
            }
        }    
    }.start();

    try {
        Thread.currentThread().sleep(1000); // это то о чём WOLF говорил. 
                                                                   // чтобы окошко с вопросом о разрешении  
                                                                   // произведения коннекта, успело отрисоваться
    } catch(Throwable t) {
        System.out.println("Exception was catched during sleep(1000) : "+t);
    }

         for(int i=0;i<1024*1024;i++)
        System.out.println("CMD_CONNECT 2" + i);
}




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


Опытный
**


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

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



Цитата(W0LF @  6.3.2007,  14:42 Найти цитируемый пост)
IOException - это checked exception!

Цитата(Dancer @  6.3.2007,  16:41 Найти цитируемый пост)

} catch(Throwable t) {                
socketConnection = null;                
System.out.println("Error occured during connection to HOST["+serverHost+"]: "+t);
}

да, конечно.
Цитата(Dancer @  6.3.2007,  16:41 Найти цитируемый пост)
//где-то глобально объявляем, а то нету никакого смысла получать коннекш черзе open()// и тут же закончив поток, потерять этот самый установленный коннекшн.SocketConnection socketConnection=null;

безусловно.
Писал так, чтобы суть вопроса была ясна.
Но...
Цитата(W0LF @  6.3.2007,  14:42 Найти цитируемый пост)
В твоем этом случае у тебя по ходу спрашивается разрешение на передачу и прием данных через сокеты

Пусть для упрощения об этом уже спрашивали, а кнопка CMD_CONNECT делает новое подключение(старое при этом закрыто).

Цитата(W0LF @  6.3.2007,  14:42 Найти цитируемый пост)
 Главный тред идеть дальше сразу после вызова метода старт, он даж не ждет соединения!

В этом и заключается вся суть вопроса. Тот огромный цикл я написал, чтобы было ясно, что он не отрабатывает полностью, т.е. Главный тред почему-то приостанавливается. Но почемуsmile 


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


alexander lonsky
***


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

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



Ты пробовал код, который тебе написал Dancer?
Вот он должен работать. Попробуй, если еще не пробовал...


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


Опытный
**


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

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



ОК, просьба модифицировать код Dancera и запустить под WTK

Код

if(c == CMD_CONNECT) {
        System.out.println("CMD_CONNECT 1");

        new Thread() {
         public void run() {
             try {
                 if(socketConnection != null)
                     socketConnection.close();
                     
socketConnection = (SocketConnection)Connector.open("socket://194.242.232.69:11111");
             } catch(Throwable t) {
                 socketConnection = null;
                 System.out.println("Error occured during connection to HOST["+"serverHost"+"]: "+t);
             }
         }    
        }.start();

        try {
         Thread.sleep(1000); // это то о чём WOLF говорил. 
         // чтобы окошко с вопросом о разрешении  
         // произведения коннекта, успело отрисоваться
        } catch(Throwable t) {
            System.out.println("Exception was catched during sleep(1000) : "+t);
        }
        
        for(int i=0;i<200;i++)
         System.out.println("CMD_CONNECT 2::" + i);
}        


так почему все-таки подвисает?


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


alexander lonsky
***


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

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



А "CMD_CONNECT 1" печатает в окне дебага?
а можешь выложить класс весь? где это все происходит.



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


Опытный
**


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

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



Цитата(W0LF @  12.3.2007,  14:08 Найти цитируемый пост)
А "CMD_CONNECT 1" печатает в окне дебага?

Печатает.
Цитата(W0LF @  12.3.2007,  14:08 Найти цитируемый пост)
а можешь выложить класс весь? 

-->
Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;

public class FirstMidlet extends MIDlet implements CommandListener{    
    SocketConnection socketConnection=null;
    Command CMD_CONNECT = new Command("Connect",Command.OK, 1);    
    private Display display;    
    private Form mainForm;
    
    public void pauseApp(){
    }
    
    public void destroyApp(boolean inconditional){
        notifyDestroyed();
    }
    
    public void startApp(){        
        display = Display.getDisplay(this);
        mainForm = new Form(null);
        mainForm .setCommandListener(this);    
        mainForm.addCommand(CMD_CONNECT);
        display.setCurrent(mainForm);
    }
    
    public void commandAction(Command c, Displayable d){
        if(c == CMD_CONNECT) {
            System.out.println("CMD_CONNECT 1");
            
            new Thread() {
                public void run() {
                    try {
                        if(socketConnection != null)
                            socketConnection.close();
                        
    socketConnection = (SocketConnection)Connector.open("socket://194.242.232.69:11111");
                    } catch(Throwable t) {
                        socketConnection = null;
                        System.out.println("Error occured during connection to HOST["+"serverHost"+"]: "+t);
                    }
                }    
            }.start();
            
            try {
                Thread.sleep(1000); // это то о чём WOLF говорил. 
                // чтобы окошко с вопросом о разрешении  
                // произведения коннекта, успело отрисоваться
            } catch(Throwable t) {
                System.out.println("Exception was catched during sleep(1000) : "+t);
            }
            
            for(int i=0;i<200;i++)
                System.out.println("CMD_CONNECT 2::" + i);
        }    
    }
}



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


Опытный
**


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

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



вот толи я долба..б, то ли одно из двух. Но если честно, то я не понимаю, нахрена в обработчик кнопок засовывать куски выполнения чего бы то ни было?
Убери свой цикл из обработчика нажатия на софткей. Ну, или просто вместо него на новую форму перейди, поменяй логику своей работы, в новом треде делай что-то что нужно пересчитать или циклы повыводить, но не в самом обработчике!!!


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


Опытный
**


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

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



Да, пример написан из познавательных целей. Конечно ты прав. Но факт остается фактом - Главный тред приостанавливается. Я прав?


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


alexander lonsky
***


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

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



ну, я тупо скомпилил это и у меня выскочило окно запроса к сети и через секунду пошел работать цикл
Код

for(int i=0;i<200;i++)
                System.out.println("CMD_CONNECT 2::" + i);


Добавлено @ 11:46 
Цитата(Dancer @  13.3.2007,  11:18 Найти цитируемый пост)
Убери свой цикл из обработчика нажатия на софткей. Ну, или просто вместо него на новую форму перейди, поменяй логику своей работы, в новом треде делай что-то что нужно пересчитать или циклы повыводить, но не в самом обработчике!!! 

Да, это правильно, но не в этом то его проблема. У него типа главный тред виснет...


Цитата(Antropoid @  13.3.2007,  11:34 Найти цитируемый пост)
Но факт остается фактом - Главный тред приостанавливается. Я прав? 

Нет, ты не прав! у меня он не виснет!
Ты в реальном девайсе пробовал? какой эмулятор юзаешь?



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


Опытный
**


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

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



Цитата(W0LF @  13.3.2007,  11:43 Найти цитируемый пост)
ну, я тупо скомпилил это и у меня выскочило окно запроса к сети и через секунду пошел работать цикл

а ты пробовал еще раз нажать на Connect(т.е. соединение должно закрыться, потом снова установиться)?
Я использую WTK 2.2.


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


alexander lonsky
***


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

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



Код

SocketConnection socketConnection=null; 

сделай локальной в своем потоке!
Код

 public void commandAction(Command c, Displayable d){
        if(c == CMD_CONNECT) {

            System.out.println("CMD_CONNECT 1");
                new Thread() {
                    public void run() {
                        SocketConnection socketConnection = null;
                        try {
                            if(socketConnection != null)
                                socketConnection.close();
                            socketConnection = (SocketConnection) Connector.open("socket://194.242.232.69:11111");
                        } catch(Throwable t) {
                            socketConnection = null;
                            System.out.println("Error occured during connection to HOST["+"serverHost"+"]: "+t);
                        }
                    }
                }.start();
                
                for(int i=0;i<200;i++)
                    System.out.println("CMD_CONNECT 2::" + i);            
        }


Это сообщение отредактировал(а) W0LF - 13.3.2007, 12:46


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


Опытный
**


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

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



Ага! Так все-таки подвисает!
Сделал
SocketConnection socketConnection
локальной переменной, -  Главный тред все-равно подвисает!!!


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


Опытный
**


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

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



если нужно чтобы соединение закрылось, то тогда либо Thread свой синхронизуй, либо вводи дополнительную логику работы.
Сейчас же у тебя получается, что ты запускаешь ещё один поток, который хочет получить коннекшн, по тому же самому адресу, при каждом нажатии на софт_батон.
Плюс ко всему, не забывай, в J2ME имеется ограничение на количество одновременно запущеных потоков. (что-то около 20 по спецификациям)
У меня работало приложение, которое из трёх разных мест качало музыкальные файлики, каждое скачивание шло в отдельном потоке, а на канвасе можно было наблюдать за процессом скачивания любого из файликов. Всё отлично работало и не подвисало smile. Я тебе ещё раз говорю - дело в "голове" smile, точнее в логике и построении работы твоего приложения. (боюсь, что свою апликуху я не найду сейчас, но если вдруг она мне попадётся, то перешлю в личку)



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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