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

Поиск:

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


Опытный
**


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

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



Народ, подскажите, как правильно пользоваться invoke?
Допустим я хочу через invoke выполнить вызов Obj.myMethod();
Что для этого надо сделать?
java.lang.reflect.Method m=Obj.myMethod();
m.invoke(Obj.myMethod );
?


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

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


Опытный
**


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

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



Конкретизирую вопрос...
Допустим у меня есть вызов auth.SteVisible(false);
после этого идет операция с сетью, и етесственно объект auth как бы замораживается... т.е. перерисовки (скрытия) не происходит.
Код

try{
           java.lang.Class _class=auth.getClass();

//             Object[] args_value = { new ?????? };  // надо передать false в качестве параметра
            java.lang.Class[] args_class = { java.lang.Class.forName ("???????") };
           java.lang.reflect.Method m=_class.getMethod("setVisible", args_class );
           m.invoke(_class, args_value);
       }catch(Exception e){
             System.out.println(e.getMessage() );
       }
}



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

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


Эксперт
****


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

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



Ну вот так, например

Код

import java.lang.reflect.*;

class MyClass
{
   public void method(int n)
   {
       for (int i = 0; i < n; i++)
       {
           System.out.println("Hello, world-" + i);
       }
   }
   
}

public class Test
{
   public static void main(String [] arg) throws Exception
   {
       MyClass myClass = new MyClass();
       Method method = MyClass.class.getMethod("method", new Class [] { int.class });
       Object[] args = new Object[1];
       Object value = new Integer(3);  
       args[0] = value;      
       method.invoke(myClass, args);
   }
}


Для boolean будет соответственно boolean.class и new Boolean(false);

http://www-106.ibm.com/developerworks/java...rary/j-dyn0603/
http://www-106.ibm.com/developerworks/java.../j-dyn0715.html

Это сообщение отредактировал(а) Domestic Cat - 22.8.2004, 00:45


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

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


Опытный
**


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

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



Уже как то постил... Надеюсь поможет smile.gif

Если пакет и классы уже есть класспасе, то делается все просто:

Код

String pakName = "com.test.";
String className = "Test";
try
{
  //Get panel class
  Class pClass = Class.forName( panelClassName );
/*
//Если у класса нет коснтруктора, без параметров, но известен конструктор с конечным числом
//параметров.(к примеру есть 2-а параметра и известны их классы). Если не понятно - объясню
  Constructor constructor = pClass.getConstructor( new Class[]{классПараметра1,классПараметра2 } );
  Object o = constructor.newInstance( new Object[]{параметр1, параметр2} );
*/
  Object o = pClass.newInstance();
  Class fClass = o.getClass();
  Method method = fClass.getMethod( methodName, new Class[]{} ); //Нет параметров... Иначе new Class[]{классПараметра1,классПараметра2 }
  Object obj = method.invoke( object, new Object[]{} ); //Нет параметров... Иначе new Object[]{параметр1, параметр2}
//Полученный obj - результат вызова метода
}
catch ( Exception e )
{
  //Error
  e.printStackTrace();
  removeAll();
}


Добавлено @ 01:13
+ еще была тема smile.gif
http://forum.vingrad.ru/index.php?showtopi...11&hl=getmethod
PM MAIL   Вверх
Alone
Дата 25.8.2004, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domestic Cat Пасиб за пример. примерно таким путем и шел, но стопорнулся на классе типа boolean... sad.gif
Теперь все стало на свои места.


DarkDS Вот! Именно этот постинг я и искал по форуму... Пасиб! smile.gif



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

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


Опытный
**


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

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



Цитата(Domestic @ 21.8.2004, 22:57)
Код

import java.lang.reflect.*;

class MyClass
{
   public void method(int n)
   {
       for (int i = 0; i < n; i++)
       {
           System.out.println("Hello, world-" + i);
       }
   }
   
}

public class Test
{
   public static void main(String [] arg) throws Exception
   {
       MyClass myClass = new MyClass();
       Method method = MyClass.class.getMethod("method", new
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Class [] { int.class });
       Object[] args = new Object[1];
       Object value = new Integer(3);  
       args[0] = value;      
       method.invoke(myClass, args);
   }
}


Можно уточнить?
Что за метод class у объекта MyClass ???


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

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


Опытный
**


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

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



Это статик переменная, которая идет от Object и инициализированная классом текущего объекта.
То есть class у MyClass инициализированна структурой java.reflection.Class, которая описывает MyClass smile.gif
Точно такую же структуру вернет вызов метода myClass.getClass();
smile.gif
PM MAIL   Вверх
Alone
Дата 25.8.2004, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насчет getClass согласен, а вот переменной class у моего объекта (public class authPanel extends javax.swing.JPanel ) нет.



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

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


Опытный
**


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

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



Она есть у всех объектов smile.gif Это одна из особенностей языка smile.gif
Добавлено @ 15:50
А javax.swing.JPanel наследуется от объекта (не в прямую а через других родительские классы), как и все классы в яве. Так вот у объекта встроена статическая переменная класс smile.gif
PM MAIL   Вверх
Alone
Дата 26.8.2004, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин... sad.gif
Вот отрывок из кода
Код

       //auth.setVisible(false);    //было

       // стало
       java.lang.Class _class=auth.getClass();
       try{
           java.lang.reflect.Method m=_class.getMethod("setVisible", new Class [] {boolean.class});
           Object [] args=new Object[1];
           Object value=new Boolean(false);
           args[0]=value;
           m.invoke(_class, args);
       }catch (Exception e){
           System.out.println("Exception e="+e.getMessage());
       }

при выполнении получаем
Exception e=object is not an instance of declaring class



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

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


Опытный
**


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

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



У тебя ошибка в m.invoke(_class, args);
Там должно быть m.invoke(auth, args);
Так как первым аргументом должен быть инстансированный объект нужного тебе класса smile.gif
PM MAIL   Вверх
Alone
Дата 26.8.2004, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, действительно.
Но поблема остается...
метод setVisible(false) объекта auth не вызывается... Объект остается замороженным, до окончания работы с сетью. sad.gif


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

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


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



А на какой строке падает ?
PM MAIL WWW ICQ   Вверх
Alone
Дата 26.8.2004, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с помощю дебага выяснил, что метод setVisible(false) вызывается, но не понимаю, почему объект не перерисовывается???
Добавлено @ 10:54

вот отладочный метод объекта auth, который я вызывал через invoke
вместо setVisible(false)
Код
public void Hide(boolean a){
       System.out.println("Has called hide()");
       mainObj.auth.setVisible(false);
       mainObj.jPanel1.updateUI();
   }

в дебаговый вывод он мне пишет, что метод был вызван. Тоесть типа Ок.
но до окончания работы с сетью (чтение/запись в сокет) это где то около 3-5сек
объект остается на экране как и прежде, с нажатой кнопкой... sad.gif



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

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


Опытный
**


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

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



У тебя работа с сетью идет в том же треде что и свинги работают?
PM MAIL   Вверх
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   Вверх
Alone
Дата 27.8.2004, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята, хоть я и начинающий smile.gif но позвольте возразить. Тут вы не правы wink.gif
Когда происходит вызов аутн, то первичные операции с сетью
происходят внутри функции аутн(){
conn.connect();
conn.send();
authuser(); которая в свою очередь производит считывание данных с сокета, и если пришло "Ок", то вызывает begin();
}

Цитата
Происходит из Эвент кью.
То есть у тебя при вызове аутн юзер ожидается завершения этой процидуры (то есть считывание данных)
Это значит что ДО того как считается - ничего прорисовыватся не будет.

Естественно. Но считывание то как раз здесь и заканчивается и в метод begin мы попадаем только после отсылки авторизации и получения ответа от сервера.
На этом операции с сетью прекращаются.
Потом я пытаюсь убрать с экрана объект аутн
и продолжать операции с сетью. (подгрузка остальных данных...)


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

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


Опытный
**


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

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



Объясняю по порядку.
Насколько я понимаю, onOk() вызывается при нажатии на кнопку (то есть из эвент листенера) и вызывается не через Инвок Лайтер.
Значит до завершения этого метода весь Эвент Кью становится колом.
Далее. Из онОк мы вызываем AuthUser(loginFld.getText(), passwdFld.getPassword().toString() );
То есть для завершения онОк мы ждем чтобы выполнилось AuthUser.
В AuthUser есть такой участвок:
Код

if (checkAuth()){
   resetAuthData();
   mainObj.begin();
}

Значит при удачной ауторизации мы ждем когда закончится работа mainObj.begin();
Далее:
Код

public void begin(){
      auth.setEnabled(false);
      auth.setVisible(false);
      jLabel1.setVisible(false); <-- Вот тут мы посылаем месседж в евент кью о том, что нужно перересовать элемент (Хинт - Эвент Кью ожидает когда мы закончим этот метод)

      thred.start();
     
      pingThread.start();
     
      String req;
      req="GETCONFIG=1";
      conn.SendTpkt(req);
     
      synchronized(configLock){ <-- Вот тут мы ожидаем когда считается данные конфига. Значит мы [b]не выйдем отсюда[/b] пока не считаем конфиг.
          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){ <-- Вот тут мы ожидаем когда считается данные abook. Значит мы [b]не выйдем отсюда[/b] пока не считаем abook.
          try{
              System.out.println("abook has blocked");
              abookLock.wait();
          }catch (InterruptedException e){
          }
      }
      System.out.println("abook has unblocked");

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

То есть у тебя ничего не будет прорисованно до тех пор, пока все не считается...
Вопросы есть? smile.gif
PM MAIL   Вверх
Alone
Дата 27.8.2004, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин... И крыть нечем...
тогда нужна архитектурная переработка.
Хорошо, ребята, Пасиб за помощь... Думаю топик мона закрывать.


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

PM MAIL WWW ICQ   Вверх
Страницы: (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.0844 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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