Выполнение задачи блокировки пользовательского интерфейса в MPS и изменение модели после завершения задачи - PullRequest
1 голос
/ 13 апреля 2019

В Jetbrains MPS Я хочу выполнить веб-запрос, когда пользователь нажимает на ярлык или действие из контекстного меню.

После успешного выполнения этого запроса я хочу показать пользователю ответ путем манипулирования моделью MPS.

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

Это плохой опыт.

Как я могу выполнить запрос асинхронно?

1 Ответ

1 голос
/ 13 апреля 2019

Веб-запрос должен выполняться в отдельном потоке - afaik MPS не имеет полной поддержки JDK8 для ForkJoinPools s; Я использую старомодный подход в этом примере.

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

The picture show a behavior method that executes an async task and changes the model after some 2Sek.

SwinUtilities.invokeAndWait используется для выполнения кода в потоке пользовательского интерфейса, а modelAccess.executeCommand оборачивает изменяющий код модели.

this.asyncUpdate является свойством концепции и отображается редактором концепции.

Задача в действии:

<iframe src='https://gfycat.com/ifr/DisfiguredAdeptAmericanbittern' frameborder='0' scrolling='no' allowfullscreen width='640' height='213'></iframe><p> <a href="https://gfycat.com/disfiguredadeptamericanbittern-mps">via Gfycat</a></p>
...