2013-07-12 3 views
0

У меня есть графический интерфейс, а GUI запускает другой поток (Java). Этот поток запускает класс, который сканирует многие веб-сайты. Теперь я хочу показать в графическом интерфейсе, сколько веб-сайтов сканируется и сколько осталось. Интересно, какое лучшее решение для этого.Показывает состояние другого потока в GUI

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

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

Каков наилучший способ сделать что-то подобное?

+0

Только поток GUI разрешен для вызова методов GUI. Вы не можете передать его в другой поток. –

+0

@ErikEkman Ну, технически вы можете, но тогда это становится беспорядочным с большим количеством 'invokeLater' ... лучше использовать' SwingWorker': P - также есть вопрос об ответственности - кто на самом деле отвечает за обновление пользовательского интерфейса - ответьте, и я придумал бы эти классы GUI, искатель, искатель, пусть он сканирует: P – MadProgrammer

ответ

1

зависит от цели.

Спросите у crawler, сколько работы сделано, это неплохая идея. Преимущество в том, что вы можете фактически контролировать, когда происходит обновление, и может сбалансировать нагрузку.

Недостатком является то, что информация может быстро затухать, и вы никогда не сможете получить точные результаты, поскольку к тому моменту, когда вы прочитали значения, искатель, возможно, уже изменил их.

Возможно, у искателя предусмотрен интерфейс обратного вызова, который регистрирует GUI, и когда сканер обновляет его состояния, обращается к графическому интерфейсу.

Проблема заключается в том, что пользовательский интерфейс может стать заболоченным с результатами, что вызывает отставание, поскольку оно пытается идти в ногу. В равной степени, в то время как гусеничный стреляет эти уведомления, он не делает это работа ...

(предполагая, что качание)

В любом случае, вам необходимо убедиться, что любые идеи, которые вы делаете Пользовательский интерфейс выполнен из потока событий Dispatching. Это означает, что если вы используете метод обратного вызова, обновления будут возвращаться из контекста потока искателей. Вам нужно будет повторно синхронизировать их с EDT.

В этом случае вы можете просто использовать SwingWorker, который предоставляет механизмы для синхронизации обновлений с EDT для вас.

Заканчивать Concurrency in Swing для более подробной информации

0

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

+0

Не забудьте убедиться, что все обновления пользовательского интерфейса выполняются в контексте EDT, если вы используете Swing – MadProgrammer