Игнорируется метод. (Java)

Модератор: Модераторы разделов

Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Игнорируется метод.

Сообщение fatboy »

Добрый день. У меня возникла проблема, в причине которой я никак не могу разобраться. В нижеприведенном методе OnStateChange не выполняется строка form.displayMessage( "*** Wrong Password ***" ) в то время как все условия для ее выполнения удовлетворены. Дебагер даже показывает вызов form.displayMessage( "*** Wrong Password ***" ), и выполнение всех инструкций в нем, но результата нет. Дальше я привел код для form.displayMessage(), но чтобы кратко словами, то этот метод выводит свой аргумент на текстовый компонент типа JTextPane. Этот же displayMessage() выполняется при любых других условиях в OnStateChange().

OnStateChange() и displayMessage() выполняются в разных потоках.

Код: Выделить всё

public void OnStateChange(AccSession arg0, AccSessionState arg1, AccResult arg2) {
    form.setConnectionStatus( arg1.toString() ); // setConnectionStatus() sets a text on a label to Online/Offline.
        if( arg1 == AccSessionState.Offline ) {
            running = false;
            if( arg2 == AccResult.ACC_E_FAIL ){
                form.displayMessage( "*** Wrong Password ***" );
            }
            if( arg2 == AccResult.ACC_E_INVALID_KEY ) {
                form.displayMessage( "*** Bad Client Key ***" ); // just adds a message to messageTextPane.
            }
            if( arg2 == AccResult.ACC_E_RATE_LIMITED ) {
                form.displayMessage( "*** Rate Limited ***" );
            }
            if( arg2 == AccResult.ACC_E_RATE_LIMITED_KEY ) {
                form.displayMessage( "*** Key Rate Limited ***" );
            }
            form.displayMessage( "*** Signed Out ***" );
            form.setLogedIn( false );
        }
        if( arg1 == AccSessionState.Online ) {
            form.displayMessage( "*** Signed In ***" );
            form.setLogedIn( true );
        }
    }


Код: Выделить всё

public void displayMessage( String message ){
        StyledDocument chatDoc = chatTextPane.getStyledDocument();

        try{
            chatDoc.insertString( chatDoc.getLength(), message  + '\n', null );
        }
        catch( BadLocationException e ){
            System.err.println( "EXCEPTION: Couldn't insert the message \"" + message + "\" into the chat window: " + e.getMessage() );
        }
    }
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: Игнорируется метод.

Сообщение cy6erGn0m »

А как проявляется отсутствие результата? текст не вставляется? я не уверен в чём у вас проблема но у меня есть следующие строки:

Код: Выделить всё

private javax.swing.JTextPane debugOutputWindow;


в init...

Код: Выделить всё

consoleDoc = debugOutputWindow.getStyledDocument();
redText = consoleDoc.addStyle( "fatal message", null );
redText.addAttribute( StyleConstants.Foreground, Color.RED );



....

Код: Выделить всё

    public void notifyException ( DebugException e ) {
        if ( e != null ) {
            try {
                String m = e.getMessage() + "\n";
                consoleDoc.insertString( consoleDoc.getLength(), m, e.isFatal() ? redText : null );
            } catch ( BadLocationException ex ) {
                Logger.getLogger( MainForm.class.getName() ).log( Level.SEVERE, null, ex );
            }
        }
    }


Всё чётко работает..
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: Игнорируется метод.

Сообщение cy6erGn0m »

OnStateChange() и displayMessage() выполняются в разных потоках.


А вот об этом поподробнее: когда они вызываются? может просто блокировку в displayMessage сделать?
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Игнорируется метод.

Сообщение fatboy »

cy6erGn0m писал(а):
13.05.2008 22:52
OnStateChange() и displayMessage() выполняются в разных потоках.


А вот об этом поподробнее: когда они вызываются? может просто блокировку в displayMessage сделать?


Есть два класса: mainForm и networkSession (Runnable) .
В mainForm сидит GUI со всеми обработчиками. Там же находится displayMessage().
В networkSession крутится очень долгий цикл while( running ), в котором обрабатываются сообщения от удаленного сервера. Там же находится OnStateChange().

Сначала создается mainForm, который при определенном событии запускает networkSession. mainForm общается с networkSession через очередь сообщений, а обратная связь получается напрямую через вызовы его - mainForm - методов ( экземпляр networkSession в mainForm создается как: session = new networkSession( this ); ).

Я добавил в OnStateChange() вывод на консоль и плюс вызов метода формы, который тоже выводит текст на консоль:

Код: Выделить всё

public void OnStateChange(AccSession arg0, AccSessionState arg1, AccResult arg2) {
    form.setConnectionStatus( arg1.toString() ); // setConnectionStatus() just sets a text on a label to Online/Offline.
        if( arg1 == AccSessionState.Offline ) {
            running = false;
            if( arg2 == AccResult.ACC_E_FAIL ){
                System.out.println( "Entered OnStateChange()" );
                form._debug();
            }
            ........
}

и

Код: Выделить всё

public void _debug(){
        System.out.println( "Entered _debug()" );
    }


В дэбагаре оба сообщения выводятся, а при нормальном запуске - нет.

Самое интересное - то, что при всех других значениях arg2 программа работает как задумано, но при ACC_E_FAIL результата нет. (arg2 == AccResult.ACC_E_FAIL) -- сравнение интов.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: Игнорируется метод.

Сообщение cy6erGn0m »

(arg2 == AccResult.ACC_E_FAIL) -- сравнение интов.


Это как? как я понимаю AccResult это enum ? Тогда arg2 это экземпляр класса. Как же это сравнение интов?

Также было бы неплохо понять когда вызвыается OnStateChange. И что значат arg2.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Игнорируется метод.

Сообщение fatboy »

Да - enum - ошибся.

Используемые здесь значения AccResult:
ACC_E_INVALID_KEY - Неизвестный ключ или отсутствие такового.
ACC_E_RATE_LIMITED - Слишком много обращений к серверу за очень короткое время.
ACC_E_RATE_LIMITED_KEY - Действие ключа истекло.
ACC_E_FAIL - Общая ошибка.


OnStateChange(AccSession arg0, AccSessionState arg1, AccResult arg2) "вызывается когда изменяется состояние сессии" (Called when the state of a session changes.) (оф. документация). Где AccSessionState arg1 - enum состояний (Online, Offline, Waiting и т.п.); AccResult arg2 - было-ли изменение сессии удачным, или результат ошибки.

Все объяснения взяты из официальной документации библиотеки. Большего написать не могу так как больше там просто нет.
Как и где вызывается OnStateChange() я не знаю - библиотека закрытая.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: Игнорируется метод.

Сообщение cy6erGn0m »

Я бы посоветовал воткнуть в код свои аутпуты и посмотреть чему же равны эти arg1 и arg2. Прямо в начале метода. Разница при отладке и в реальной жизни заключается в скорости выполнения и в том что при отладке вы делаете большие паузы (по меркам машины задержки огромны) что особенно сказывается при отладке распределённых/сетевых приложений. Видимо в реальной жизни "проскакивает", а при отладке что-то успевает отработать.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Игнорируется метод.

Сообщение fatboy »

Последовал Вашему совету. Спасибо. Оказалось что ответ сервера, получаемый при отладке, сильно отличается от такового при нормальном выполнении программы. Еще раз спасибо за советы.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали: