Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Пашин Евгений от 01-10-2015, 08:02:26

Название: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Пашин Евгений от 01-10-2015, 08:02:26
Добрый день, всем! Требуется помощь в создании формы, отображающей процесс выполнения процедуры.

1. Создаю проект.
2. Добавляю форму в проект, в которой отображаю процесс выполнения процедуры настройки листов.
3. В проекте пишу большой модуль для работы с листами. То есть есть некий модуль настройки листов, который выполняется по нажатию кнопки на открытой форме.
4. Запуск формы происходит асинхронно. Так, что выполнение процедуры не влияет на управление формой. Двигать ее могу и изменять ее размеры (есть небольшие тормоза, но не критично!).
5. Все хорошо работает, НО с одним условием, если запуск процедуры я провожу при включенной форме.
6. Теперь мне поставили задачу вывести форму и автоматический запуск процедуры перенастройки листов. То есть при запуске команды в командной строке AutoCAD запускается модуль, который открывает форму и сразу запускает процедуру настройки листов. И тут началось следующее:
- Во-первых, при запуске формы я не смог запустить процедуру настройки листов, как это я делал с помощью кнопки при включенной форме.
- Во-вторых, если даже я и запускаю процедуру после открытия формы, то я не могу форму двигать или менять ее размеры, куда-то пропадает вся асинхронность.
- В-третьих, попытка открыть форму и попытаться запустить процедуру нажатия (той самой) кнопки приводит к тому, что AutoCAD фатально закрывается.

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

Пример того как я асинхронно запускаю процедуру настройки листов при открытом окне:


Код - vb.net [Выбрать]
  1. ...
  2. Imports System.Threading
  3. Imports System.Runtime.Remoting.Messaging
  4. ...
  5.  
  6.     Delegate Sub myD()
  7.  
  8.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  9.         Dim path As String = My.Application.Info.DirectoryPath ' Это то, что мы обсуждали вчера!
  10.         ListView1.Visible = False
  11.         WebBrowser1.Visible = True
  12.         Dim myP As String = path & "\index.html"
  13.         WebBrowser1.Navigate(myP)
  14.         Dim d As myD = AddressOf Method_New ' Как раз та самая процедура перенастройки листов
  15.         Dim AsCB As AsyncCallback = AddressOf AsyncCallBack_Method
  16.         Dim SyncC = WindowsFormsSynchronizationContext.Current
  17.         d.BeginInvoke(AsCB, SyncC)
  18.     End Sub
  19.  
  20.     Public Sub AsyncCallBack_Method(ByVal IArg As IAsyncResult)
  21.         Dim AsContext As SynchronizationContext = IArg.AsyncState
  22.         Dim Arg As AsyncResult
  23.         Arg = IArg
  24.         Arg.AsyncDelegate.EndInvoke(IArg)
  25.         Dim SorPCB As SendOrPostCallback = AddressOf PP_CallBack
  26.         AsContext.Post(SorPCB, Nothing)
  27.     End Sub
  28.     Public Sub PP_CallBack()
  29.         MsgBox("Process complete!")
  30.     End Sub

На видео будет видно, что в первый раз запускается процедура, но форма виснет! Да и весь AutoCAD тоже.

Во второй раз когда я запускаю уже с формы, как будет видно (ту же самую процедуру), то не виснет (лишь немного тормозит).


Please, help!


Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Пекшев aka Modis от 01-10-2015, 09:35:24
1. Зачем нужно иметь возможность двигать окно и менять его размер? При таком условии нужно только иметь возможность нажать кнопку "Отмена". Кстати, кнопки на форме должны стать неактивными
2. VB.Net и Form (ИМХО) - уменьшают шанс найти хорошее решение в разы! C# и WPF - сила  :D (еще раз - ИМХО)
3. Чтобы запускать какие либо методы как по нажатию кнопки, так и другим способом - нужно их не в обработчике события кнопки делать, а отдельным методом. А в обработчике нажатия кнопки только вызывать нужный метод
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Пашин Евгений от 01-10-2015, 09:51:02
Зачем нужно иметь возможность двигать окно и менять его размер?

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

VB.Net и Form (ИМХО) - уменьшают шанс найти хорошее решение в разы! C# и WPF - сила   (еще раз - ИМХО)

уменьшают шанс - ладно хоть шанс есть )

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

Dim d As myD = AddressOf Method_New ' Как раз та самая процедура перенастройки листов

Вы об этом?

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

Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Пекшев aka Modis от 01-10-2015, 10:03:01
Я к тому, что - зачем вам при вызове команды из командной строки запускать форму (если я правильно понял что там происходит)? Вам нужно запустить саму процедуру и только после ее окончания запустить форму с результатом
Судя по видео - так и происходит. Но судя по словам
Цитировать
То есть при запуске команды в командной строке AutoCAD запускается модуль, который открывает форму и сразу запускает процедуру настройки листов
происходит не так
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Ривилис от 01-10-2015, 10:37:27
Пашин Евгений,
1. Как создавать видео и вставлять его в сообщения на форуме указано у меня в подписи. Незачем засорять форум mp4-файлами по несколько мегабайт. Форум не резиновый.
2. Не вникая в детали. Если у тебя нормально работает при нажатии кнопки на форме, то и эмулируй это нажатие. Как это сделать - ищи сам:
https://www.google.com/search?q=simulate+button+click+c%23&ie=utf-8&oe=utf-8#q=simulate%20button%20click%20vb.net
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Пашин Евгений от 01-10-2015, 10:41:37
Не вникая в детали. Если у тебя нормально работает при нажатии кнопки на форме, то и эмулируй это нажатие.

Сейчас заценю... One moment please.
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Пашин Евгений от 01-10-2015, 10:49:50
Александр Ривилис, вы - гений!

Сработало! Подскажите ссылку на правило, как вставлять видео  и я выложу результат действия! Спасибо Вам огромное!!!
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Пекшев aka Modis от 01-10-2015, 10:51:42
Чесание правого уха левой пяткой, как скажет Андрей Бушман ;D
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Ривилис от 01-10-2015, 10:52:47
Подскажите ссылку на правило, как вставлять видео  и я выложу результат действия! Спасибо Вам огромное!!!

Добавление Autodesk Screencast видео в сообщение на форуме (http://adn-cis.org/forum/index.php?topic=2813)

Александр Ривилис, вы - гений!

Я знаю.  ;)
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Пашин Евгений от 02-10-2015, 11:44:49
Александр Ривилис, здравствуйте!

Button.PerformClick сработал на ура!

Выкладываю видео результата.




Кстати, торможение на экране мне кажется вызвано ScreenCast-ом, потому что без него работает быстро и без подвисаний.
Название: Re: Как создать форму выполнения процесса без тормозов и замираний
Отправлено: Александр Ривилис от 02-10-2015, 12:32:04
Кстати, торможение на экране мне кажется вызвано ScreenCast-ом, потому что без него работает быстро и без подвисаний.
Вполне возможно. Зависит от производительности компьютера.