Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6

Периодический запуск не статического метода (без нажатия кнопки на форме)

07.10.2011, 14:18. Показов 3468. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

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

На форме есть кнопка для вывода этих результатов.
Можно ли как-нибудь обойтись без этой кнопки или чтобы обработчик ее нажатия запускался сам периодически?
Если вызывать из другого класса, который extends TimerTask
Ошибка non-static method setList1Items() cannot be referenced from a static context,
даже если вызывать из класса-наследника главного класса, реализующего интерфейс Runnable, где периодически вызывается метод родительского класса, заполняющий список jList резудьтатами, никаких результатов в форме не выводится (а они в ArrayList есть)

что нужно сделать с формой, чтобы вывести результаты?
jList1.repaint() не помог...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2011, 14:18
Ответы с готовыми решениями:

После нажатия кнопки в первой форме, становится невидимым TextBox во второй форме
у меня 2 формы .в первой форме, после нажатия кнопки открывается вторая форма. как сделать чтобы после нажатия кнопки в первой форме ,...

Как из обработчика Form1_KeyPress вызвать событие для нажатия заданной по имени кнопки на форме (кнопки 0-9)
Пишу калькулятор. Есть несколько кнопок (Button) с цифрами и знаками. Для цифр имена кнопок: but_0, but_1, ... but_9 На все кнопки с...

Как отправить все чекбоксыы без обновления страницы и без нажатия кнопки?
Нужно обновлять данные без перезагрузки и без нажатия кнопки на странице, пишу так: <form method="POST"...

10
81 / 81 / 8
Регистрация: 10.06.2011
Сообщений: 258
07.10.2011, 17:12
Посмотри использование Callable, тогда не будет такой странной объектной сетки и можно будет разобраться, когда кто закончил работу. Ну или как минимум какой нибудь ThreadPool.
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6
07.10.2011, 18:19  [ТС]
То есть все потоки должны быть не Runnable, а Callable? Куда они будут возвращать информацию, о том, что закончили поиск, и как проверять эту информацию?
Потом мне не обязательно дожидаться окончания их работы, т.к. это может быть очень долго, а результаты они добавляют в статический ArrayList главного класса уже в процессе своего выполнения, и эти результаты нужно выводить в jList главного окна (генерировать событие для обновления списка, как это делается при клике на кнопку)
0
81 / 81 / 8
Регистрация: 10.06.2011
Сообщений: 258
07.10.2011, 23:18
Ну, начнём с того, что ArrayList не синхронизирован, по этому у тебя программа будет часто падать.
Callable возврощяет информацию туда, где ты её потребуеш. И этот метод ( call() ) блокирует, пока работа не завершена. Но если почитать документацию, то там будет всё точнее описано.

А если просто нужно "периодически нажимать на кнопку", то в чём конкретно тогда проблемма? На каком участке кода выдаёт ошибку?
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6
10.10.2011, 17:50  [ТС]
действительно ArrayList не синхронизирован... Переделал на java.util.concurrent.CopyOnWriteArrayLis t
но в главном классе все равно оставил ArrayList, правда дописал модификатор volatile

сделал класс PeriodTask, extends от главного, но реализующий интерфейс Runnable (с Callable не очень понятно)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class PeriodTask extends MainClass implements Runnable
{
//конструктор    
public PeriodTask(int timeInterval) {
        timerInterval = timeInterval;
}
 
    @Override
    public void run() {
        try {
//в методе run() бесконечный цикл
            while(true) {
                Thread.sleep(timerInterval);
                System.out.println("PeriodTask.run()");
                if(MainClass.findWords != null) {
                    setList1Items(); 
                }
            }
        } catch (Exception ex) {
            System.out.println(ex + " PeriodTask.run()");
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
}
Метод setList1Items(); в классе MainClass выводит список найденных слов, но он не выводит...
хотя, если вызвать его из обработчика нажатия кнопки на форме, все выводит (пункты появляются)

MainClass.findWords содержит ArrayList <String> найденных слов (проверено)

Что еще нужно, чтобы список заполнялся автоматически, без нажатия на кнопку?

Добавлено через 14 минут
timerInterval - это private int timerInterval; в классе PeriodTask
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
10.10.2011, 21:14
прицепи к ArrayList Collections и получи synchronizedList - это раз.
ну и чтоб оно заработало надо триду сделать start(), например

Java
1
2
Thread t = new Thread(new PeriodTask(11111));
t.start();
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6
10.10.2011, 22:41  [ТС]
Java
1
2
Thread t = new Thread(new PeriodTask(11111));
t.start();
Я так и сделал в главном классе (в главном фрейме)

но функция, запущенная из триды
Java
1
2
3
if(MainClass.findWords != null) {
                    setList1Items(); 
                }
не делает что надо, а именно не показывает список

только из главного класса, если запустить из обработчика события нажатия кнопки, показывает...

А там бесконечный цикл не запустишь... только при обработке события запускается

Добавлено через 10 минут
Цитата Сообщение от mutagen Посмотреть сообщение
прицепи к ArrayList Collections и получи synchronizedList - это раз.
ну и чтоб оно заработало надо триду сделать start(), например
это как? java.util.concurrent.CopyOnWriteArrayLis t синхронизированный, а Collections тут причем?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
10.10.2011, 23:18
а ты сделай этот лист final это тоже сделает его синхронизированным или так:

Java
1
List<Type> list = Collections.synchronizedList(new ArrayList<Type>());
а этот CopyOnWriteArrayList очень прожорливый по ресурсам

Добавлено через 19 минут
Цитата Сообщение от Денис А Посмотреть сообщение
но функция, запущенная из триды

Java
1
2
3
if(MainClass.findWords != null) {
* * * * * * * * * * setList1Items(); 
* * * * * * * * }
не делает что надо, а именно не показывает список
эта функция видимо пуляет в свой собственный унаследованный лист данные а не в тот что в главном классе, ты его в трид передавай как линк и и в конструкторе сеть его как this.list = list; тогда он будет тот что надо
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6
11.10.2011, 13:42  [ТС]
а ты сделай этот лист final это тоже сделает его синхронизированным
Этот лист не может быть final, в него добавляют значения производные классы от главного (в параллельных потоках)
или так:
Java
1
List<Type> list = Collections.synchronizedList(new ArrayList<Type>());
в List нет метода clone(), а мне нужно передавать копию списка, а не указатель на него...
можно так:
Java
1
 List<Type> list2 = ((List<Type>) ((ArrayList) list).clone());
но только подозреваю, что может нарушиться синхронизация из-за преобразования в ArrayList для использования метода clone(), потом обратного преобразования...

с CopyOnWriteArrayList так бы не мучился, там есть метод clone()
оставлю пока CopyOnWriteArrayList


класс PeriodTask надо сделать чтобы он стал потоком-демоном
он ничего не делает, кроме как периодически вызывает метод главного класса setList1Items();
в котором происходит следующее:
Java
1
2
            System.out.println(findStringWords.size() + " строк");
            jList1.setListData(findStringWords.toArray());
на консоли периодически появляются строки
177 строк
177 строк
177 строк

но список не обновляется - он пустой
а если нажать на кнопку, в обработчике которой стоит запуск того же метода setList1Items();
то список сразу заполнится значениями
0
81 / 81 / 8
Регистрация: 10.06.2011
Сообщений: 258
11.10.2011, 13:51
Цитата Сообщение от Денис А Посмотреть сообщение
Этот лист не может быть final, в него добавляют значения производные классы от главного (в параллельных потоках)
Почему не может? С объектом можно спокойно работать, но нельзя будет перезаписать его ссылку.
Но final тут не поможет.

в List нет метода clone(), а мне нужно передавать копию списка, а не указатель на него...
Метод clone() есть в Object, т.е. есть везде.
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 6
12.10.2011, 14:27  [ТС]
NetBeans почему-то ругается, когда пытаешься вызвать clone() у объекта List
Java
1
2
3
cannot find symbol
  symbol:   method clone()
  location: variable obj of type java.util.List
Добавлено через 2 часа 11 минут
вот нашел что-то похожее, надо разобраться...
http://developers.sun.ru/content/view/159/89/

Добавлено через 22 часа 16 минут
В модели Swing все потоки приложения делятся на 3 типа:

Начальный поток (initial thread)
Поток обработки событий (event dispatch thread (EDT))
Рабочий поток (worker threads)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2011, 14:27
Помогаю со студенческими работами здесь

Запуск функции после нажатия кнопки
Как мне запустить функцию после нажатия кнопки? На данный момент функция запускается при загрузке страницы. &lt;form...

Имитация нажатия кнопки в форме
Имеется группа куда входит 3 кнопки ( на картинке 1, 2,3) При нажатие на кнопку из группы, кнопка становится темно синий (свойство цвет при...

Отслеживание нажатия кнопки на форме.
Добрый день. Вот столкнулся с такой проблемой. Вопрос прост: Как отследить событие нажатия кнопки на форме и ,допустим, вывести...

Обработчик нажатия кнопки на форме
Всем привет! У меня есть несколько кнопок на форме. Допустим 5. Мне надо отловить нажатие каждой кнопки. Скажите пожалуйста, можно ли через...

Как в обработчике нажатия кнопки использовать локальную переменную другого метода?
Нужно чтобы в методе кнопки clicked() можно было использовать переменную db из MainWindow #include &quot;mainwindow.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru