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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов через invoke, хелпъ 
:(
    Опции темы
Alone
Дата 26.8.2004, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Нет. Для чтения сокета у меня отдельный тред.
Отправка в сокет идет, правда, в этом же треде... Это как то повлияет?
Хотя отправляется очень малое кол-во байт...
вот кусок кода
Код
       java.lang.Class _class=auth.getClass();
       try{
           java.lang.reflect.Method m=_class.getMethod("Hide", new Class [] {boolean.class});
           Object [] args=new Object[1];
           Object value=new Boolean(false);
           args[0]=value;
           m.invoke(auth, args);
       }catch (Exception e){
           System.out.println("Exception e="+e.getMessage());
       }

       /* по логике, в этот момент объект auth уже должен скрыться...*/

       // стартуем нитку чтения сокета
       thred.start();

       // стартуем пинговалку
       pingThread.start();
     
       // отправляем запрос        
       String req;
       req="GETCONFIG=1";
       conn.SendTpkt(req);
       
       // ...и ждем ответа
       synchronized(configLock){
           try{
               System.out.println("getConfig has blocked");
               configLock.wait();
           }catch (InterruptedException e){
               
           }
       }
       System.out.println("getConfig has unblocked");



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 26.8.2004, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Это у тебя происходит в каком то из Листенеров как я понимаю?
PM MAIL   Вверх
Alone
Дата 26.8.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



нет. это вызов по иерархии
main()->creatAllObjects()->prestart()->begin()


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 26.8.2004, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Просто такое чуство что твое ожидание ответа тормозит весь эвент кью. В итоге просто сообщения об обработки событий не доходят до назначения
PM MAIL   Вверх
Domestic Cat
Дата 26.8.2004, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Здесь рефлекшн вообще не нужен, он ведь делаeт то же самое что и просто setVisible().
А что проиcxодит в этом самом auth? Проблема здесь не в потоке, который вызывает setVisible(), а
в другом треде. Может код для него посмотрим?


--------------------

PM   Вверх
DarkDS
Дата 26.8.2004, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Скорее всего проблемма вот в этом:
Код

      synchronized(configLock){
          try{
              System.out.println("getConfig has blocked");
              configLock.wait();
          }catch (InterruptedException e){
             
          }
      }

То есть программа не выходит из этой процедуры. А если это работает в одном треде с евент кью, то скорее всего сам эвент кью будет заторможен smile.gif
PM MAIL   Вверх
Alone
Дата 26.8.2004, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Тоесть получается нельзя располагать в одном треде invoke и obj.wait() ???
И еще: если можно, на пальцах, что такое рефлексия?


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 26.8.2004, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Я так понял, что проблема в том, что вызов setVisible() не дает желаемого результата.
Поскольку он идет до synchronized, то synchronized никак на него не влияет. Еще раз - проблема в замораживании треда с synchronized, или с бездействием setVisible?
Добавлено @ 16:56

Цитата(Alone @ 26.8.2004, 07:38)
Тоесть получается нельзя располагать в одном треде invoke и obj.wait() ???


Да почему нельзя? Можно.

Цитата(Alone @ 26.8.2004, 07:38)
если можно, на пальцах, что такое рефлексия?

Рефлекшн нужен чтобы:

-Determine the class of an object.
-Get information about a class's modifiers, fields, methods, constructors, and superclasses.
-Find out what constants and method declarations belong to an interface.
-Create an instance of a class whose name is not known until runtime.
-Get and set the value of an object's field, even if the field name is unknown to your program until -runtime.
-Invoke a method on an object, even if the method is not known until runtime.
-Create a new array, whose size and component type are not known until runtime, and then modify the array's components.


--------------------

PM   Вверх
Alone
Дата 26.8.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



еще до использования synchronized, setVisible нормально отрабатывал только после завершения операций с сетью. Тоесть на несколько секунд происходит замораживание объекта auth с состоянием нажатой кнопки...
объект представлен в виде панели с авторизационной формочкой и кнопкой
после чтения данных с сокета и их обработки, объект благополучно исчезает и прорисовывается следующий... Вот это меня и злит... sad.gif
Хотя действия выполняются последовательно. Код в топике приведен.

Я хочу найти такй способ , чтоб мои объекты прорисовывались независимо от сетевых задержек (там где это присутствует)


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 26.8.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



А можно весь код для auth? Здесь есть только метод Hide


--------------------

PM   Вверх
Alone
Дата 26.8.2004, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Там в принципе ничего такого...
Метод Hide я делал для отладки, когда с invoke тренировался... Он не нужен. там прямой вызов auth.setVisible(false)
вот как выполняется код:
Код

main() {
createAllObjects();
prestart();
}

// рисуем форму аутентификации
// поля логин пароль и кнопка
public void preStart(){
       auth.setVisible(true);
       jLabel1.setVisible(true);
}

часть кода из auth
Код

// когда юзер нажмет кнопку:
public void onOk(){
       infoLbl.setVisible(false);
       if(loginFld.getText().compareToIgnoreCase("")!=0 && passwdFld.getPassword().toString().compareToIgnoreCase("")!=0 )
           AuthUser(loginFld.getText(), passwdFld.getPassword().toString() );
       else{
           infoLbl.setText("Неверный ввод !");    
           infoLbl.setVisible(true);
       }
       updateUI();
   }
   

   public void AuthUser(java.lang.String login, java.lang.String password) {
       
       try{
           mainObj.conn.Connect();
       }
       catch (Exception e){
           //mainObj.mon.toLog(e.getMessage());
       }
       
       if (mainObj.conn.isConnected()) {
           
           String req="";
           req+="LOGIN="+loginFld.getText();
           char[] i=passwdFld.getPassword();
           String a="";
           for (int k=0; k<i.length; k++) { a+=i[k]; }
           req+="; PASSWORD="+a;
           //System.out.println(a );
           mainObj.conn.SendTpkt(req);
           
           
           if (checkAuth()){
               resetAuthData();
               mainObj.begin();
^^^^^^^^^^^^^^^^^^^^ вот интересующая часть
           }else{
               resetAuthData();
               mainObj.conn.DisConnect();
               infoLbl.setText("Ошибка авторизации");
               infoLbl.setVisible(true);
           }
       }else{
           infoLbl.setText("Немогу соединиться с сервером");
           infoLbl.setVisible(true);
       }
}

   public boolean checkAuth() {
       
       //System.out.println("In CheckAuth");
       
       String tpkt=new String();
       int len=mainObj.conn.ReadTpkt();
       //System.out.println("len="+len);
       
       if ( len>0) {
           String buf=new String();
           try {
               buf=mainObj.conn.ReadMsg(len);
               //System.out.println("buf="+buf);
               
               if (buf.indexOf("OK", 0)!=-1 ){
                   return true;
               }
           }catch (Exception e) {
               //mainObj.mon.toLog(e.getMessage() );
           }
       }
       return false;
   }


При удачной авторизации возвращаемся в майн код
Код
   public void begin(){
       auth.setEnabled(false);
       auth.setVisible(false);
       jLabel1.setVisible(false);
       /*
       java.lang.Class _class=auth.getClass();
       try{
           java.lang.reflect.Method m=_class.getMethod("Hide", new Class [] {boolean.class});
           Object [] args=new Object[1];
           Object value=new Boolean(false);
           args[0]=value;
           m.invoke(auth, args);
       }catch (Exception e){
           System.out.println("Exception e="+e.getMessage());
       }
       */
       thred.start();
       
       pingThread.start();
       
       String req;
       req="GETCONFIG=1";
       conn.SendTpkt(req);
       
       synchronized(configLock){
           try{
               System.out.println("getConfig has blocked");
               configLock.wait();
           }catch (InterruptedException e){
               
           }
       }
       System.out.println("getConfig has unblocked");
       
       req="GETABOOK=1";
       dwnPanel.setStatus("Загрузка данных...");
       conn.SendTpkt(req);
       synchronized(abookLock){
           try{
               System.out.println("abook has blocked");
               abookLock.wait();
           }catch (InterruptedException e){
           }
       }
       System.out.println("abook has unblocked");

       /* прорисовка остальных форм*/
}



Это сообщение отредактировал(а) Alone - 26.8.2004, 17:49


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 26.8.2004, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Код

public void onOk(){
      infoLbl.setVisible(false);
      if(loginFld.getText().compareToIgnoreCase("")!=0 && passwdFld.getPassword().toString().compareToIgnoreCase("")!=0 )
          AuthUser(loginFld.getText(), passwdFld.getPassword().toString() );
------------------
      else{
          infoLbl.setText("Неверный ввод !");    
          infoLbl.setVisible(true);
      }
      updateUI();
  }

Происходит из Эвент кью.
То есть у тебя при вызове аутн юзер ожидается завершения этой процидуры (то есть считывание данных)
Это значит что ДО того как считается - ничего прорисовыватся не будет.
Добавлено @ 18:40
По идее самый простой способ - запустить инвок лайтер и из него при успешной авторизации закрывать окно.
Вечером (часа через 3) могу примерный код набросать...
Добавлено @ 18:42
Кстати... Другой вариант - запустить майн.бегин в инвок лайтер. Правда какими пост эффектами это обернется - нужно подумать smile.gif

Это сообщение отредактировал(а) DarkDS - 26.8.2004, 18:47
PM MAIL   Вверх
Domestic Cat
Дата 26.8.2004, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Решение (по-моему) такое: вынести код с synchronized в отдельный тред.
DarkDS прав, поток не успевает обработать евент до synchronized.


--------------------

PM   Вверх
DarkDS
Дата 26.8.2004, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Цитата(Domestic @ 26.8.2004, 18:44)
DarkDS прав

Просто сам в начале изучения на такие грабли не раз и не два напарывался...
PM MAIL   Вверх
Domestic Cat
Дата 26.8.2004, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Ну так ... Тоже напарывался - первый раз когда прогресс бар замирал и прорисовывался до
100% только после выполнения треда. Все равно забывается... smile.gif

Это сообщение отредактировал(а) Domestic Cat - 26.8.2004, 18:59


--------------------

PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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