|
|
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Запускаю постгрессовскую процедуру из swing-приложения. Ловлю сообщения от сервера в другом потоке (java.sql.SQLWarning warning = proc.getWarnings(); ), вывожу с помощью System.out.println("Message: " + warning.getMessage()); Во время выполнения процедуры аккуратно выводятся сообщения от сервера в стандартный вывод. Если делаю перенаправление System.out.println в компоненту JTextArea или просто напрямую пытаюсь вывести сообщения (разумеется в отдельном потоке) с помощью textArea.append(warning.getMessage()); то все сообщения выводятся, но только по завершению работы процедуры. То есть в стандартный поток stdout все выводится сразу в течение работы процедуры, а если выводить не в stdout, а в компоненту, или перенаправить stdout в компоненту, то вывод начнется только по завершению работы процедуры. Как бы сделать так, чтобы вывод в компоненту производился не после отработки процедуры, а по мере поступления сообщений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 15:12 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ А так? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 15:15 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Эххх... Точно... Наверное, так и надо было... После обеда попробую... Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 15:21 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Неа... Все равно одно и то же - в стандартный вывод корректно выводит, в компонент - только по окончанию процедуры. Если без процедуры, а, например, по таймеру в компонент кидать записи (в том числе и в случае перенаправления потока вывода в компонент) - все работает тоже корректно. То есть - в компонент по таймеру поток вывода перенаправляет нормально, из постгресовской процедуры в стандартный вывод выплевывает нормально, а в компонент из постгресовской процедуры - только по завершению процедуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 16:53 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
SwingUtilities.invokeLater может обеспечить только эффект прямо противоположный нужному мне: можно добиться, чтобы и в stdout начинала выводиться информация так же только после окончания процедуры. Мне нужно не замедлить вывод в выходной поток, а ускорить вывод в компонент... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 18:06 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
else12, Ну, можно попробовать invokeAndWait. Но это бестолково, ИМХО. И ещё, похоже, вы соврали про "Ловлю сообщения от сервера в другом потоке". Скорее всего, у вас EDT заблокирован какой-то работой, вот ничего и не выводится. Снимите дамп потоков в процессе, когда сообщения уже пришли, но на экран не вывелись. Покажите чем занят EDT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 18:26 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowiczelse12, Ну, можно попробовать invokeAndWait. Но это бестолково, ИМХО. И ещё, похоже, вы соврали про "Ловлю сообщения от сервера в другом потоке". Скорее всего, у вас EDT заблокирован какой-то работой, вот ничего и не выводится. Снимите дамп потоков в процессе, когда сообщения уже пришли, но на экран не вывелись. Покажите чем занят EDT. Ну, если бы я соврал, то и в стандартный поток информация не попадала бы. Просто выдача в stdout - это выдача данных во внешний поток, а там информация успевает прорисоваться, а внутри программы у меня два равноприоритетных потока - в одном процедура выполняется, в другом ловятся данные от сервера, и данные успевают передаться в компоненту, но дальше выполнение процедуры, так как потоки равноприоритетны, скорее всего, глушит прорисовку, прорисовываются они только после ее выполнения. Ну, мне так кажется, может быть, ошибочно. Как будет свободная минута попробую поиграться с приоритетами и что-нибудь придумать - просто времени на эту задачу почти нет и потому попросил о помощи - может, кто-то сталкивался с этим. Ну, если удастся разобраться, то выложу решение - мало ли, может, у кого-то еще такая же ерундень встретится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 10:37 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
else12Ну, если бы я соврал, то и в стандартный поток информация не попадала бы. Просто выдача в stdout - это выдача данных во внешний поток, а там информация успевает прорисоваться, а внутри программы у меня два равноприоритетных потока - в одном процедура выполняется, в другом ловятся данные от сервера, и данные успевают передаться в компоненту, но дальше выполнение процедуры, так как потоки равноприоритетны, скорее всего, глушит прорисовку, прорисовываются они только после ее выполнения. Ну, мне так кажется, может быть, ошибочно. Как будет свободная минута попробую поиграться с приоритетами и что-нибудь придумать - просто времени на эту задачу почти нет и потому попросил о помощи - может, кто-то сталкивался с этим. Ну, если удастся разобраться, то выложу решение - мало ли, может, у кого-то еще такая же ерундень встретится... Вы глубоко заблуждаетесь. Приоритеты у двух потоков, как минимум один из которых заблокирован на IO это ересь несусветная. Почитайте информацию по ссылки, что я привел выше. У вас в EDT происходит какая-то долгоиграющая задача, поэтому и UI не обновляется до её окончания. Это очень легко увидеть в дампе потоков, который вы стесняетесь привести. Стоит научится использовать SwingWorker. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 11:56 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 13:18 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
else12Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается. Вы не понимаете механизм Event Dispatch Thread. Это особый поток, который обслуживает UI. Если вы что-то делаете в этом потоке, то этот поток перестаёт обслуживать UI, он обслуживает вашу задачу. Когда же ваша задача окончена, поток возвращается к остальным событиям в очереди и тогда JTextArea обновляется. Речь не о блокировке потока. А о том что вы его заняли какой-то задачей, а её стоило выполнять в отдельном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 13:27 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowiczelse12Я понял Вашу логику, спасибо Вам за ответ, но дампы не выкладываю не потому, что стесняюсь, а из-за катастрофической нехватки времени. Блокировки нет - иначе и в выходной поток не передавалась бы информация, а она передается. Вы не понимаете механизм Event Dispatch Thread. Это особый поток, который обслуживает UI. Если вы что-то делаете в этом потоке, то этот поток перестаёт обслуживать UI, он обслуживает вашу задачу. Когда же ваша задача окончена, поток возвращается к остальным событиям в очереди и тогда JTextArea обновляется. Речь не о блокировке потока. А о том что вы его заняли какой-то задачей, а её стоило выполнять в отдельном потоке. Эта задача - выполнение процедуры на сервере, и, скорее всего, это какие-то внутренности jdbc. Я подготавливаю процедуру, потом запускаю два потока : в одном - вывод сообщений (запускается первым и ждет начала запуска процедуры), в другом (отдельном потоке) запускается сама процедура (proc.execute();). И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 13:45 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
else12И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка. Ваше ИМХО, против моего. Рассудить может только дамп потоков в процессе. Ну, или код посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 13:49 |
|
||
|
Вывод System.out из SQLWarning работает сразу, а в JTextArea - ждет конца процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowiczelse12И ничего больше. Если вместо запуска процедуры по таймеру выплевывать какие-то сообщения, которые выводить потом в TextArea, то все нормально работает. Если запустить процедуру и выводить сообщения от сервера, то начинается заморочка. Ваше ИМХО, против моего. Рассудить может только дамп потоков в процессе. Ну, или код посмотреть. Я понял, я проверю. Не исключаю своей ошибки. Но чуть позже. Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2015, 13:56 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39048330&tid=2124955]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
182ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 473ms |

| 0 / 0 |
