Как создать форму выполнения процесса без тормозов и замираний

Автор Тема: Как создать форму выполнения процесса без тормозов и замираний  (Прочитано 8075 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, всем! Требуется помощь в создании формы, отображающей процесс выполнения процедуры.

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!



Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
1. Зачем нужно иметь возможность двигать окно и менять его размер? При таком условии нужно только иметь возможность нажать кнопку "Отмена". Кстати, кнопки на форме должны стать неактивными
2. VB.Net и Form (ИМХО) - уменьшают шанс найти хорошее решение в разы! C# и WPF - сила  :D (еще раз - ИМХО)
3. Чтобы запускать какие либо методы как по нажатию кнопки, так и другим способом - нужно их не в обработчике события кнопки делать, а отдельным методом. А в обработчике нажатия кнопки только вызывать нужный метод

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Зачем нужно иметь возможность двигать окно и менять его размер?

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

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

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

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

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

Вы об этом?

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


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я к тому, что - зачем вам при вызове команды из командной строки запускать форму (если я правильно понял что там происходит)? Вам нужно запустить саму процедуру и только после ее окончания запустить форму с результатом
Судя по видео - так и происходит. Но судя по словам
Цитировать
То есть при запуске команды в командной строке AutoCAD запускается модуль, который открывает форму и сразу запускает процедуру настройки листов
происходит не так

Отмечено как Решение Пашин Евгений 02-10-2015, 11:49:42

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пашин Евгений,
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
« Последнее редактирование: 02-10-2015, 12:32:49 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Не вникая в детали. Если у тебя нормально работает при нажатии кнопки на форме, то и эмулируй это нажатие.

Сейчас заценю... One moment please.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Александр Ривилис, вы - гений!

Сработало! Подскажите ссылку на правило, как вставлять видео  и я выложу результат действия! Спасибо Вам огромное!!!

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Чесание правого уха левой пяткой, как скажет Андрей Бушман ;D

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите ссылку на правило, как вставлять видео  и я выложу результат действия! Спасибо Вам огромное!!!

Добавление Autodesk Screencast видео в сообщение на форуме

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

Я знаю.  ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Александр Ривилис, здравствуйте!

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

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




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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, торможение на экране мне кажется вызвано ScreenCast-ом, потому что без него работает быстро и без подвисаний.
Вполне возможно. Зависит от производительности компьютера.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение