Распараллелить работу двух команд

Автор Тема: Распараллелить работу двух команд  (Прочитано 488 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #15 : 08-11-2019, 11:55:08 »
Интересно что за глючное железо приводит к таким проблемам?
Это вполне нормальное поведение, когда для показа изображения требуется регенерация.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #16 : 08-11-2019, 12:05:36 »
Atomohod,
Воспользуйся командой НАСТРВИД (_VIEWRES) для настройки "гладкости" дуг/окружностей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2163
  • Карма: 583
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Распараллелить работу двух команд
« Ответ #17 : 08-11-2019, 12:10:09 »
Здравствуйте!

У меня просьба пользователя написать авторегенератор для Acad 2015, чтобы он реагировал на все действия в чертеже и запускал Regen All. Рассматриваю стандартный  new Timer(MyMethod, null, 1000, Timeout.Infinite). Но, если я это делаю как команду внутри dll, то получается что она активна весь сеанс работы с чертежом и блокирует возможность вызова других команд. Есть идеи как можно написать регенератор без такого эффекта?

Если абстрагироваться от того, что конечная цель вызывает недоумение и много вопросов, и сосредоточиться только на реализации, то я бы сделал примерно так:
1. Запускаем команду "Начать авторегенерацию".
2. В этой команде подписываемся на нужные события: добавление объектов в чертёж, модификацию объектов и т.д. и т.п.
3. Плюс подписываемся на событие Application.Idle.
После этого команда завершается и остаются работать в фоне только подписки на события. То есть, блокировки для других команд не будет.
4. При срабатывании любого из событий из п.2 включается обработчик, задача которого просто изменить флаг состояния. У флага два состояния. Одно - регенерация не нужна, второе - регенерация требуется. По умолчанию - первое состояние, а когда срабатывает интересующее событие - переключаем на второе состояние.
5. При срабатывании Application.Idle проверяем состояние флага из п.4. Если требуется регенерация - запускаем её. Флаг сбрасываем на начальное состояние.
Ну и, по-хорошему, нужна ещё одна команда - "Закончить авторегенерацию", которая отключает события из п. 2-3. Это когда пользователь осознает масштаб трагедии и захочет вернуть всё в исходное состояние :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #18 : 08-11-2019, 12:14:03 »
Это когда пользователь осознает масштаб трагедии и захочет вернуть всё в исходное состояние
Я думаю, что на этом можно будет остановиться. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2163
  • Карма: 583
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Распараллелить работу двух команд
« Ответ #19 : 08-11-2019, 12:33:05 »
Ну иногда чтобы понять что-то, нужно самому прыгнуть на грабли. Пока этого не сделаешь, все доводы кажутся неубедительными. А так, в плане реализации, задачка-то интересная. И полезна для освоения работы с событиями. И пользователь может быть поймёт, что надо быть осторожнее со своими желаниями :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #20 : 08-11-2019, 12:38:55 »
Ну иногда чтобы понять что-то, нужно самому прыгнуть на грабли. Пока этого не сделаешь, все доводы кажутся неубедительными. А так, в плане реализации, задачка-то интересная. И полезна для освоения работы с событиями. И пользователь может быть поймёт, что надо быть осторожнее со своими желаниями :)
Пока Atomohod будет работать с чертежами, в которых регенерация занимает пару секунд всё будет более-менее нормально. Но как только попадётся реальный чертеж, требующий для регенерации даже несколько десятков секунд, как от этой "авторегенерации" будет достаточно непросто избавится. А про чертежи, в которых регенерация длится несколько минут (а то и десятков минут) я совсем молчу. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2163
  • Карма: 583
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Распараллелить работу двух команд
« Ответ #21 : 08-11-2019, 13:07:40 »
Если всё сделать аккуратно, то авторегенерация не будет настолько злобной, что её даже отключить нельзя будет. На крайний случай - диспетчер задач поможет  ;D
А так - пусть пробует, развлекается. Почему нет? :)

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 305
  • Карма: 49
Re: Распараллелить работу двух команд
« Ответ #22 : 08-11-2019, 22:52:09 »
Это вполне нормальное поведение, когда для показа изображения требуется регенерация.
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
для показа да, но когда заблокировано перемещение по чертежу, это странно.

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 305
  • Карма: 49
Re: Распараллелить работу двух команд
« Ответ #23 : 08-11-2019, 23:39:18 »
Если всё сделать аккуратно, то авторегенерация не будет настолько злобной
Пользователь сам должен принимать решение выполнять регенерацию или нет.
В ряде сценариев выполнение регенерации без участия пользователя полезно.

Например после завершения некоторых команд: вставка-регенерация, очистка-регенерация. При условии, что пользователю нужно вызвать ее, чтобы увидеть результат и продолжить работу.
И после смены масштаба, т.к. для отображения типов линий нужно выполнить регенерацию. Главное, что это не очень частое событие.

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

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #24 : 08-11-2019, 23:53:57 »
В ряде сценариев выполнение регенерации без участия пользователя полезно.

Например после завершения некоторых команд: вставка-регенерация, очистка-регенерация. При условии, что пользователю нужно вызвать ее, чтобы увидеть результат и продолжить работу.
И после смены масштаба, т.к. для отображения типов линий нужно выполнить регенерацию. Главное, что это не очень частое событие.
Полностью согласен. Но тут достаточно вызвать регенерацию в конце выполнения своей команды. Но если на каждый чих будет выполнятся регенерация - это перебор.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение