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

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

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

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Здравствуйте!

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

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #1 : 07-11-2019, 22:34:45 »
Atomohod,
У меня нет слов. Видимо ты не понимаешь к чему это приведёт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Re: Распараллелить работу двух команд
« Ответ #2 : 07-11-2019, 23:19:22 »
У меня нет слов. Видимо ты не понимаешь к чему это приведёт.
Может быть действительно не понимаю. Как тогда возможно реализовать авторегенерацию? И возможно ли? В новых версиях Автокада она же как-то реализована и притом "из коробки". На счет любого действия с чертежом я может некорректно выразился - подразумевается масштабирование и вставка/модификация графических примитивов пользователем.

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #3 : 07-11-2019, 23:22:23 »
В новых версиях Автокада она же как-то реализована и притом "из коробки".
Она во всех версиях (как минимум в последних 25) есть. REGENMODE установи в 1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #4 : 07-11-2019, 23:26:06 »
На счет любого действия с чертежом я может некорректно выразился - подразумевается масштабирование и вставка/модификация графических примитивов пользователем.
Совершенно некорректно. И кроме того в насыщенных чертежах операция регенерации может длится несколько минут (сравнимо со временем открытия такого чертежа). Как ты себе представляешь работу с чертежом, если вдруг у тебя запустится регенерация, которая будет столь продолжительна? И про распараллеливание ты ерунду написал. Пока регенерация не закончится ты с чертежом делать ничего не сможешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Re: Распараллелить работу двух команд
« Ответ #5 : 07-11-2019, 23:50:47 »
И про распараллеливание ты ерунду написал.
Вот здесь я реально не понял - ясное дело что пока команда активна я не могу работать с чертежом. Так как я запускаю команду и она работает внутри сессии либо с интервалом либо при срабатывании события, то получается что она активна и запустить что либо я не могу - в этом и есть проблема. Однако есть точно такая же ситуация с Autosave - в настройках ставится интервал и через него регулярно идет автосохранение. И да - в момент автосохранения приложение виснет на пару сек. Если все просто решается установкой переменной, то для чего пользователю доступны целых две кнопки Regen и Regen all? Я запутался.

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #6 : 07-11-2019, 23:55:02 »
Однако есть точно такая же ситуация с Autosave - в настройках ставится интервал и через него регулярно идет автосохранение.
Нет. Автосохранение выполняется только в период простоя AutoCAD, когда он не выполняет никаких действий.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Re: Распараллелить работу двух команд
« Ответ #7 : 07-11-2019, 23:55:23 »
Переменная у меня REGENMODE =1, но линии все равно деградируют например круг становится ломаным, при масштабировании. Это и нужно убрать

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #8 : 07-11-2019, 23:57:30 »
Если все просто решается установкой переменной, то для чего пользователю доступны целых две кнопки Regen и Regen all?
Не всё. Регенерация выполняется тогда, когда AutoCAD считает, что без неё обойтись нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #9 : 08-11-2019, 00:02:39 »
whiparc установи в 1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Re: Распараллелить работу двух команд
« Ответ #10 : 08-11-2019, 00:04:32 »
Насчет версий нашел в рекламе Acad 2016 от представителя Autodesk с которым работали-"Если на компьютере установлена видеокарта, поддерживающая DirectX 11 и включено аппаратное ускорение, то можно будет увидеть, насколько изменена обработка кривых и весов линий. Мало того - теперь REGENMODE до конца отрабатывает свое название и полностью регулирует режим регенерации модели." Если ему верить, то раньше этого не было.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 254
  • Карма: 0
Re: Распараллелить работу двух команд
« Ответ #11 : 08-11-2019, 00:09:12 »
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #12 : 08-11-2019, 00:09:17 »
Atomohod,
Это я комментировать не буду. При включении аппаратного ускорения бывают такие артефакты, что я предпочитаю его отключать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 10420
  • Карма: 1322
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Распараллелить работу двух команд
« Ответ #13 : 08-11-2019, 00:10:30 »
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
Пользователь сам должен принимать решение выполнять регенерацию или нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 309
  • Карма: 49
Re: Распараллелить работу двух команд
« Ответ #14 : 08-11-2019, 11:51:28 »
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
А какая версия AutoCAD, видеокарта, и какое имя драйвера в настройках AutoCAD?
Интересно что за глючное железо приводит к таким проблемам?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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