Ide start инициализация, что это такое
Обновлено: 21.11.2024
Встроенное приложение должно само правильно инициализировать ЦП и окружающие компоненты, чтобы иметь возможность работать правильно. Однако бывают ситуации во время разработки и производства, когда полезно настроить систему перед запуском приложения.
Вот некоторые типичные ситуации:
- Конфигурация логики выбора микросхемы для разрешения загрузки в устройства памяти, недоступные после сброса ЦП
- Настройка системных часов для обеспечения более быстрой работы часов JTAG, загрузки и т. д.
- Отключение сторожевых таймеров
Инициализация используется только с подключенным отладчиком. Когда цель работает автономно, инициализация не выполняется, и цель может вести себя иначе.
winIDEA может выполнять инициализацию при следующих событиях:
Инициализация перед программированием
После запуска эмуляции ЦП и его остановки инициализация обычно используется для подготовки системы к программированию.
Эта инициализация может быть аннулирована после завершения загрузки (снова сбрасывается ЦП). Таким образом, ЦП запускается в автономном режиме, но с перепрограммированной памятью.
ЦП, которые нельзя остановить сразу после сброса, не инициализируются до тех пор, пока они не будут остановлены. Дополнительную информацию см. в отдельных технических примечаниях, прилагаемых к вашей системе.
Чтобы выполнить инициализацию Перед программированием выполните загрузку
Инициализация перед сеансом отладки
Инициализация после завершения загрузки программы используется, когда основная инициализация становится недействительной из-за сброса ЦП после загрузки, но некоторая инициализация все еще требуется.
Чтобы выполнить инициализацию перед выполнением сеанса отладки:
Инициализация при прикреплении
Инициализация при подключении используется, когда winIDEA подключается к уже работающей системе, т. е. цель не сбрасывается On-Chip Analyzer BlueBox. Он был введен для существующих INI-скриптов, которые не могут -if-else- для типа "присоединения", выполняемого winIDEA. То же самое может быть достигнуто в скрипте EVE при инициализации перед отладкой, потому что он вызывается с параметром, указывающим причину выполнения.
Чтобы выполнить инициализацию при подключении, выполните команду "Присоединить" на панели инструментов отладки winIDEA.
Дополнительную информацию о создании и запуске сценариев EVE см. в Руководстве пользователя iSYSTEM EVE Script.
Инициализация настроена Параметры оборудования/процессора:
Инициализация перед программированием/перед сеансом отладки/при подключении
Настройки по умолчанию предназначены для большинства случаев. Если они не подходят для вашего случая, выберите собственный сценарий (файл .ini или .cpp). Чтобы добавить пользовательский сценарий инициализации, выполните процедуру пользовательской настройки .
Подключение — действия, необходимые для установки отладочного соединения.
Инициализировать — действия, необходимые для инициализации периферийных устройств устройства.
Сброс ЦП после загрузки (отменяет инициализацию)
Если этот параметр отмечен, ЦП сбрасывается после завершения загрузки. Это фактически делает недействительной инициализацию (которая использовалась для разрешения загрузки) и предоставляет ЦП среду, равную автономной работе (без подключенного отладчика). Не используется во время разработки при загрузке приложений и их запуске из энергозависимой памяти, т.е. ОЗУ.
Инициализация перед сеансом отладки выполняется всегда, за исключением загрузки, где не установлен флажок Сброс после загрузки.
Настройки по умолчанию предназначены для большинства случаев. Если они не подходят для вашего случая, выберите собственный сценарий (файл .ini или .cpp). Чтобы добавить собственный сценарий инициализации, выполните процедуру пользовательской настройки.
В этом сообщении объясняется, как код может выполняться при запуске приложения или при открытии нового проекта.В нем также описаны другие возможности запуска кода для инициализации вашего подключаемого модуля.
Запуск приложения
Часто бывает так, что какой-то код необходимо запустить сразу после загрузки плагина. Этого можно добиться несколькими способами.
Если вам нужны методы init и dispose, реализуйте компонент приложения. Если вам не нужна функциональность удаления, можно реализовать операцию предварительной загрузки. Если вам нужно получить доступ к текущему проекту в этом коде, см. дополнительные пояснения ниже.
Компоненты приложения
Компонент приложения предоставляет перехватчики для запуска кода при запуске и завершении работы приложения. Убедитесь, что вы не блокируете IDE, выполняя трудоемкие действия.
Прикладные компоненты вашего подключаемого модуля всегда загружаются, даже если никакие другие компоненты на самом деле их не используют. Если возможна инициализация по запросу, следует реализовать службу приложений.
Если вы хотите запускать длительные действия, но не нуждаетесь в удалении при завершении работы, вы можете сделать это, внедрив вместо этого расширение preloadingActivity.
Ссылки
MyApplicationComponent.java Пример кода на github ApplicationComponent.java Определение интерфейса, предоставленное JetBrains
Предварительная загрузка точек расширения активности
Если вы хотите запустить какие-либо фоновые действия, которые отнимают много времени или, возможно, блокируют их при запуске, вы можете реализовать точку расширения preloadingActivity. Реализации PreloadingActivity выполняются в отдельном потоке в IntelliJ, по одной за раз. Индикатор ProgressIndicator позволяет убедиться, что приложение не было закрыто.
Ссылки
MyPreloadingActivity.java Пример кода на github PreloadingActivity.java Определение интерфейса расширения preloadingActivity. Preloader.java Класс IntelliJ, который вызывает все доступные реализации preloadingActivity .
Закрытие приложения
Чтобы выполнить код при завершении работы приложения, реализуйте метод disposeComponent компонента приложения.
Инициализация проекта
Приложение инициализируется только один раз, но одновременно может быть открыто несколько проектов. Также возможно, что ни один проект не открыт, например. при первом запуске. Если вам нужен доступ к текущему проекту, вы должны реализовать либо компонент проекта, либо расширение активности запуска.
Если вам нужно удалить данные после закрытия проекта, вы должны реализовать компонент. Если нужна только инициализация, достаточно расширения активности запуска.
Компоненты проекта
Компонент проекта аналогичен компоненту приложения. Он создается при открытии нового проекта и удаляется после закрытия проекта.
Текущий проект доступен путем внедрения зависимостей в качестве параметра конструктора. Вы можете добавить другие компоненты приложения и/или проекта в качестве параметров конструктора.
Ссылки
MyProjectComponent.java Пример кода на github ProjectComponent.java Определение интерфейса компонента проекта
Активность при запуске после открытия проекта
Если вы хотите запустить некоторый код после открытия проекта, вы можете реализовать точку расширения postStartupActivity. Если ваше расширение реализует интерфейс DumbAware, то метод runActivity запускается сразу после открытия проекта. Если ваше расширение не реализует этот интерфейс, то runActivity откладывается до тех пор, пока не завершится простой режим, т. е. как только будет выполнена фоновая индексация IntelliJ.
Будьте осторожны! Я не вижу никакой гарантии, что выполнение выполняется в фоновом режиме, поэтому будьте особенно осторожны, чтобы не заблокировать все приложение. Собственные реализации IntelliJ этой точки расширения обычно вызывают дополнительные фоновые действия или отображают уведомление после открытия проекта.
Ссылки
MyPostStartupActivity.java Пример кода на github StartupActivity.java Определение интерфейса расширения StartupActivity ProjectManagerImpl.java Реализация IntelliJ, в которой выполняются все точки расширения postStartupActivity
Закрытие проекта
Реализуйте метод disposeProject компонента ProjectComponent для выполнения некоторого кода после закрытия проекта.
Часто вам нужно выполнять специальные действия при запуске приложения и очищать все, когда приложение останавливается. В этом руководстве объясняется, как:
Напишите приложение Quarkus с основным методом
Создавайте приложения командного режима, которые запускают задачу, а затем завершают работу
Получать уведомления при запуске приложения
Уведомление об остановке приложения
Предпосылки
Чтобы выполнить это руководство, вам необходимо:
Примерно 15 минут
JDK 11+ установлен с правильно настроенным JAVA_HOME
Apache Maven 3.8.1+
Дополнительно Quarkus CLI, если вы хотите его использовать
При необходимости Mandrel или GraalVM должны быть установлены и настроены соответствующим образом, если вы хотите создать собственный исполняемый файл (или Docker, если вы используете собственную сборку контейнера)
Решение
Мы рекомендуем следовать инструкциям в следующих разделах и создавать приложение шаг за шагом. Однако вы можете сразу перейти к завершенному примеру.
Решение находится в каталоге lifecycle-quickstart.
Создание проекта Maven
Во-первых, нам нужен новый проект. Создайте новый проект с помощью следующей команды:
Чтобы создать проект Gradle, добавьте параметр --gradle или --gradle-kotlin-dsl.
Дополнительную информацию об установке и использовании Quarkus CLI см. в руководстве Quarkus CLI.
Чтобы создать проект Gradle, добавьте параметр -DbuildTool=gradle или -DbuildTool=gradle-kotlin-dsl.
структура Maven
примеры файлов Dockerfile для собственного режима и режима jvm
файл конфигурации приложения
Основной метод
По умолчанию Quarkus автоматически генерирует основной метод, который запускает Quarkus, а затем просто ждет завершения работы. Давайте предоставим наш собственный основной метод:
1 | Эта аннотация указывает Quarkus использовать этот метод в качестве основного, если он не переопределен в конфигурации |
2 | Это запускает Quarkus |
Этот основной класс запустит Quarkus и будет запускать его до тех пор, пока он не остановится. Это ничем не отличается от автоматически сгенерированного основного класса, но имеет то преимущество, что его можно просто запустить непосредственно из IDE без необходимости запускать команду Maven или Gradle.
Если вы хотите выполнить логику при запуске, вы должны вызвать Quarkus.waitForExit() , этот метод будет ждать, пока не будет запрошено завершение работы (либо из-за внешнего сигнала, например, когда вы нажимаете Ctrl+C, либо из-за того, что поток вызвал Quarkus. асинхронный выход() ).
Пример того, как это выглядит, приведен ниже:
Внедрение аргументов командной строки
Можно внедрить аргументы, которые были переданы в командной строке:
Аргументы командной строки можно передать приложению с помощью флага -D со свойством quarkus.args :
Для режима разработки Quarkus:
Для jar бегуна: java -Dquarkus.args= -jar target/quarkus-app/quarkus-run.jar
Для собственного исполняемого файла: ./target/lifecycle-quickstart-1.0-SNAPSHOT-runner -Dquarkus.args=
Прослушивание событий запуска и завершения работы
Создайте новый класс с именем AppLifecycleBean (или выберите другое имя) в пакете org.acme.lifecycle и скопируйте следующее содержимое:
1 | Метод, вызываемый при запуске приложения |
2 | Метод, вызываемый при запуске приложения. приложение завершает работу |
События также вызываются в режиме разработки между каждым повторным развертыванием. |
Методы могут получить доступ к внедренным bean-компонентам. Дополнительные сведения см. в классе AppLifecycleBean.java. |
В чем отличие от @Initialized(ApplicationScoped.class) и @Destroyed(ApplicationScoped.class)
В режиме JVM нет реальной разницы, за исключением того, что StartupEvent всегда запускается после @Initialized(ApplicationScoped.class), а ShutdownEvent запускается до @Destroyed(ApplicationScoped.class) . Однако для собственной исполняемой сборки @Initialized(ApplicationScoped.class) запускается как часть собственного процесса сборки, тогда как StartupEvent запускается при выполнении собственного образа. Подробности см. в разделе Три фазы Bootstrap и философии Quarkus.
В приложениях CDI событие с квалификатором @Initialized(ApplicationScoped.class) запускается при инициализации контекста приложения. Дополнительную информацию см. в спецификации. |
Использование @Startup для инициализации компонента CDI при запуске приложения
Бин, представленный классом, методом производителя или полем, аннотированным @Startup, инициализируется при запуске приложения:
Если мы хотим поддерживать локальную среду Sorbet IDE для пакетов, языковой сервер должен поддерживать прерывания во время инициализации.
Языковой сервер Sorbet предполагает наличие одного GlobalState, и ответственность за поддержание этого GlobalState распределяется между двумя потоками:
- Поток индексатор + координатор, который решает, можно ли проверить тип обновления файла без повторной проверки типа всего проекта. Затем он планирует работу по проверке типов (и вытесняет медленные операции для обработки быстрых операций, чтобы уменьшить задержку).
- Поток проверки типов, который владеет WorkerPool и фактически выполняет проверку типов и другие операции IDE.
В этой схеме есть один неудобный момент: во время инициализации индексатор должен заимствовать WorkerPool потока проверки типов, чтобы эффективно анализировать и хэшировать каждый файл на платном сервере, чтобы он мог принимать эффективные решения по проверке типов.Во время этого процесса Sorbet перестает отвечать на запросы IDE, что сейчас нормально, потому что инициализация происходит только один раз — при запуске Sorbet — и нет значимых запросов, которые можно было бы обработать до завершения этой активности.< /p>
В мире упаковщиков инициализация будет происходить каждый раз, когда пользователь открывает файл в пакете, который еще не инициализирован. Это будет общее занятие. Пока это происходит, Sorbet должен иметь возможность прервать этот процесс и ответить на вопросы о других пакетах.
Предлагаемое решение
Мы должны изменить модель многопоточности, чтобы индексатор мог запросить завершение работы средства проверки типов (в данном случае анализ каждого файла на платном сервере), а средство проверки типов могло передать результат обратно индексатору. Я представляю, как это работает:
- Координатор передает очередь задач индексатору и запрашивает следующую задачу для обработки.
- Индексатор видит, что ему нужно выполнить инициализацию, создает задачу инициализации и возвращает ее.
- Координатор планирует работу в потоке проверки типов.
- Проверка типов завершает работу и ставит новую задачу в очередь задач, содержащую данные, необходимые индексатору.
- Координатор просыпается, передает очередь задач индексатору, а индексатор извлекает необходимые данные.
Во время инициализации индексатор может выбрать, какие задачи в очереди могут быть обработаны. Если все они заблокированы при инициализации, он может сообщить об этом координатору, и координатор будет спать до следующего изменения очереди задач.
Обратите внимание, что эти изменения должны работать в однопоточном цикле emscripten. В приведенном выше дизайне я ожидаю, что очередь задач будет передана для проверки типов, и что, если в ней что-то есть, цикл emscripten передаст это самому индексатору.
Читайте также: