Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры / 13 сообщений из 13, страница 1 из 1
10.09.2015, 15:12
    #39048189
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Запускаю постгрессовскую процедуру из swing-приложения. Ловлю сообщения от сервера в другом потоке (java.sql.SQLWarning warning = proc.getWarnings(); ), вывожу с помощью

System.out.println("Message: " + warning.getMessage());

Во время выполнения процедуры аккуратно выводятся сообщения от сервера в стандартный вывод. Если делаю перенаправление System.out.println в компоненту JTextArea или просто напрямую пытаюсь вывести сообщения (разумеется в отдельном потоке) с помощью

textArea.append(warning.getMessage());

то все сообщения выводятся, но только по завершению работы процедуры. То есть в стандартный поток stdout все выводится сразу в течение работы процедуры, а если выводить не в stdout, а в компоненту, или перенаправить stdout в компоненту, то вывод начнется только по завершению работы процедуры.

Как бы сделать так, чтобы вывод в компоненту производился не после отработки процедуры, а по мере поступления сообщений?
...
Рейтинг: 0 / 0
10.09.2015, 15:15
    #39048196
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

А так?
Код: java
1.
SwingUtilities.invokeLater(()->textArea.append(warning.getMessage()));
...
Рейтинг: 0 / 0
10.09.2015, 15:21
    #39048207
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Blazkowicz,

Эххх... Точно... Наверное, так и надо было... После обеда попробую... Спасибо!
...
Рейтинг: 0 / 0
10.09.2015, 16:53
    #39048330
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Неа... Все равно одно и то же - в стандартный вывод корректно выводит, в компонент - только по окончанию процедуры. Если без процедуры, а, например, по таймеру в компонент кидать записи (в том числе и в случае перенаправления потока вывода в компонент) - все работает тоже корректно.

То есть - в компонент по таймеру поток вывода перенаправляет нормально, из постгресовской процедуры в стандартный вывод выплевывает нормально, а в компонент из постгресовской процедуры - только по завершению процедуры...
...
Рейтинг: 0 / 0
10.09.2015, 18:06
    #39048413
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
SwingUtilities.invokeLater может обеспечить только эффект прямо противоположный нужному мне: можно добиться, чтобы и в stdout начинала выводиться информация так же только после окончания процедуры. Мне нужно не замедлить вывод в выходной поток, а ускорить вывод в компонент...
...
Рейтинг: 0 / 0
10.09.2015, 18:26
    #39048425
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
else12,

Ну, можно попробовать invokeAndWait. Но это бестолково, ИМХО.
И ещё, похоже, вы соврали про "Ловлю сообщения от сервера в другом потоке". Скорее всего, у вас EDT заблокирован какой-то работой, вот ничего и не выводится. Снимите дамп потоков в процессе, когда сообщения уже пришли, но на экран не вывелись. Покажите чем занят EDT.
...
Рейтинг: 0 / 0
11.09.2015, 10:37
    #39048804
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Blazkowiczelse12,

Ну, можно попробовать invokeAndWait. Но это бестолково, ИМХО.
И ещё, похоже, вы соврали про "Ловлю сообщения от сервера в другом потоке". Скорее всего, у вас EDT заблокирован какой-то работой, вот ничего и не выводится. Снимите дамп потоков в процессе, когда сообщения уже пришли, но на экран не вывелись. Покажите чем занят EDT.
Ну, если бы я соврал, то и в стандартный поток информация не попадала бы.

Просто выдача в stdout - это выдача данных во внешний поток, а там информация успевает прорисоваться, а внутри программы у меня два равноприоритетных потока - в одном процедура выполняется, в другом ловятся данные от сервера, и данные успевают передаться в компоненту, но дальше выполнение процедуры, так как потоки равноприоритетны, скорее всего, глушит прорисовку, прорисовываются они только после ее выполнения. Ну, мне так кажется, может быть, ошибочно.

Как будет свободная минута попробую поиграться с приоритетами и что-нибудь придумать - просто времени на эту задачу почти нет и потому попросил о помощи - может, кто-то сталкивался с этим. Ну, если удастся разобраться, то выложу решение - мало ли, может, у кого-то еще такая же ерундень встретится...
...
Рейтинг: 0 / 0
11.09.2015, 11:56
    #39048963
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
else12Ну, если бы я соврал, то и в стандартный поток информация не попадала бы.

Просто выдача в stdout - это выдача данных во внешний поток, а там информация успевает прорисоваться, а внутри программы у меня два равноприоритетных потока - в одном процедура выполняется, в другом ловятся данные от сервера, и данные успевают передаться в компоненту, но дальше выполнение процедуры, так как потоки равноприоритетны, скорее всего, глушит прорисовку, прорисовываются они только после ее выполнения. Ну, мне так кажется, может быть, ошибочно.

Как будет свободная минута попробую поиграться с приоритетами и что-нибудь придумать - просто времени на эту задачу почти нет и потому попросил о помощи - может, кто-то сталкивался с этим. Ну, если удастся разобраться, то выложу решение - мало ли, может, у кого-то еще такая же ерундень встретится...
Вы глубоко заблуждаетесь. Приоритеты у двух потоков, как минимум один из которых заблокирован на IO это ересь несусветная.
Почитайте информацию по ссылки, что я привел выше. У вас в EDT происходит какая-то долгоиграющая задача, поэтому и UI не обновляется до её окончания. Это очень легко увидеть в дампе потоков, который вы стесняетесь привести.
Стоит научится использовать SwingWorker.
...
Рейтинг: 0 / 0
11.09.2015, 13:18
    #39049114
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Blazkowicz,

Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается.
...
Рейтинг: 0 / 0
11.09.2015, 13:27
    #39049131
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
else12Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается.
Вы не понимаете механизм Event Dispatch Thread. Это особый поток, который обслуживает UI. Если вы что-то делаете в этом потоке, то этот поток перестаёт обслуживать UI, он обслуживает вашу задачу. Когда же ваша задача окончена, поток возвращается к остальным событиям в очереди и тогда JTextArea обновляется.
Речь не о блокировке потока. А о том что вы его заняли какой-то задачей, а её стоило выполнять в отдельном потоке.
...
Рейтинг: 0 / 0
11.09.2015, 13:45
    #39049179
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Blazkowiczelse12Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается.
Вы не понимаете механизм Event Dispatch Thread. Это особый поток, который обслуживает UI. Если вы что-то делаете в этом потоке, то этот поток перестаёт обслуживать UI, он обслуживает вашу задачу. Когда же ваша задача окончена, поток возвращается к остальным событиям в очереди и тогда JTextArea обновляется.
Речь не о блокировке потока. А о том что вы его заняли какой-то задачей, а её стоило выполнять в отдельном потоке.
Эта задача - выполнение процедуры на сервере, и, скорее всего, это какие-то внутренности jdbc. Я подготавливаю процедуру, потом запускаю два потока : в одном - вывод сообщений (запускается первым и ждет начала запуска процедуры), в другом (отдельном потоке) запускается сама процедура (proc.execute();). И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка.
...
Рейтинг: 0 / 0
11.09.2015, 13:49
    #39049185
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
else12И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка.
Ваше ИМХО, против моего. Рассудить может только дамп потоков в процессе. Ну, или код посмотреть.
...
Рейтинг: 0 / 0
11.09.2015, 13:56
    #39049194
else12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
Blazkowiczelse12И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка.
Ваше ИМХО, против моего. Рассудить может только дамп потоков в процессе. Ну, или код посмотреть.
Я понял, я проверю. Не исключаю своей ошибки. Но чуть позже. Спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]