Управление поиском На рис.5 изображена диаграмма состояний программы. Состояния показаны в виде прямоугольников с закруглёнными углами, внутри которых написано название состояния. Стрелками показаны переходы между состояниями. Около стрелки может быть написано название события, которое вызывает данный переход. Рис.5. Диаграмма состояний (процесс поиска) Закрашенный кружок означает начало работы программы. Сразу после запуска выполняется создание и отображение интерфейса. Затем программа переходит в состояние ожидания. Выйти из этого состояния можно только при возникновении какого-нибудь события. Например, если пользователь нажмёт на одну из кнопок. На этой диаграмме показана работа программы только во время поиска файлов. Обработка других сообщений, например, нажатия на кнопку "Обзор" или "Закрыть", здесь не показана. Она довольно простая, и нет никакого смысла загромождать диаграмму. Как только пользователь нажимает на кнопку "Поиск", начинается подготовка к поиску, во время которой выполняется создание и инициализация всех необходимых объектов, в том числе и нового потока (thread). Создание и запуск потока означает, что наша программа разделяется на две части, которые выполняются одновременно и независимо друг от друга. Естественно, потоки могут взаимодействовать между собой, например, отправлять сообщения друг другу. В нашем случае один поток отвечает за работу интерфейса, а второй – выполняет поиск файлов. На диаграмме создание нового потока показано с помощью горизонтальной толстой линии, в которую входит одна стрелка, а выходит – две. Поиск начинается с определения начальных параметров и вызова метода onSearchStart() для всех объектов, которые следят за процессом поиска (в нашем случае это MainPanel). После этого происходит вызов рекурсивного метода search(…). Этот метод показан как отдельное большое состояние. Рассмотрим его подробнее. В первую очередь проверяется состояние переменной stop. Эта переменная равна true только в одном случае, если пользователь нажал на кнопку "Стоп". При этом программа выходит из состояния поиска. Если stop == false, то выполняется просмотр содержимого папки, и вызывается метод onSearchProgressChange(…) для всех объектов, которые следят за процессом поиска. В качестве параметров этому методу предаются: количество просмотренных папок, найденных файлов и их общий размер. Если есть не просмотренные папки, мы вызываем метод search(…) с новыми параметрами, т. е. переходим в это же состояние. Если все вложенные папки просмотрены, то поиск заканчивается, и вызывается метод onSearchEnd(). Одновременно с процессом поиска, в параллельном потоке выполняется работа с интерфейсом. После начала поиска этот поток находится в состоянии ожидания. При вызове методов onSearchStart() и onSearchProgressChange(…) выполняется обновление интерфейса (выводится информация о процессе поиска рис.2), и поток снова переходит в состояние ожидания. Если пользователь нажимает на кнопку "Стоп", происходит вызов метода stopSearch() класса FileFinder, в котором переменной stop присваивается значение true. Это приводит к прекращению поиска (выходу из метода search(…)). Вы, наверное, заметили безымянное состояние, в которое мы попадаем после нажатия на кнопку "Стоп" или вызова метода onSearchEnd(). Здесь ничего особенного не происходит, просто это состояние показано для того, чтобы объединить эти два события. После завершения поиска, созданный нами дополнительный поток прекращает свою работу, и программа переходит в состояние отображения результатов. Здесь мы открываем диалоговое окно со списком найденных файлов. Просмотрев результаты, пользователь нажимает кнопку "Закрыть", и программа переходит в начальное состояние ожидания.
Понравилась статья? Получай обновления и будь всегда в курсе событий!