Добрый день, всем! Требуется помощь в создании формы, отображающей процесс выполнения процедуры.
1. Создаю проект.
2. Добавляю форму в проект, в которой отображаю процесс выполнения процедуры настройки листов.
3. В проекте пишу большой модуль для работы с листами. То есть есть некий модуль настройки листов, который выполняется по нажатию кнопки на открытой форме.
4. Запуск формы происходит асинхронно. Так, что выполнение процедуры не влияет на управление формой. Двигать ее могу и изменять ее размеры (есть небольшие тормоза, но не критично!).
5. Все хорошо работает, НО с одним условием, если запуск процедуры я провожу при включенной форме.
6. Теперь мне поставили задачу вывести форму и автоматический запуск процедуры перенастройки листов. То есть при запуске команды в командной строке AutoCAD запускается модуль, который открывает форму и сразу запускает процедуру настройки листов. И тут началось следующее:
- Во-первых, при запуске формы я не смог запустить процедуру настройки листов, как это я делал с помощью кнопки при включенной форме.
- Во-вторых, если даже я и запускаю процедуру после открытия формы, то я не могу форму двигать или менять ее размеры, куда-то пропадает вся асинхронность.
- В-третьих, попытка открыть форму и попытаться запустить процедуру нажатия (той самой) кнопки приводит к тому, что AutoCAD фатально закрывается.
Кто-нибудь может подсказать, как решить эту простую (на первый взгляд) задачу.
Пример того как я асинхронно запускаю процедуру настройки листов при открытом окне:
...
Imports System.Threading
Imports System.Runtime.Remoting.Messaging
...
Delegate Sub myD()
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim path As String = My.Application.Info.DirectoryPath ' Это то, что мы обсуждали вчера!
ListView1.Visible = False
WebBrowser1.Visible = True
Dim myP As String = path & "\index.html"
WebBrowser1.Navigate(myP)
Dim d As myD = AddressOf Method_New ' Как раз та самая процедура перенастройки листов
Dim AsCB As AsyncCallback = AddressOf AsyncCallBack_Method
Dim SyncC = WindowsFormsSynchronizationContext.Current
d.BeginInvoke(AsCB, SyncC)
End Sub
Public Sub AsyncCallBack_Method(ByVal IArg As IAsyncResult)
Dim AsContext As SynchronizationContext = IArg.AsyncState
Dim Arg As AsyncResult
Arg = IArg
Arg.AsyncDelegate.EndInvoke(IArg)
Dim SorPCB As SendOrPostCallback = AddressOf PP_CallBack
AsContext.Post(SorPCB, Nothing)
End Sub
Public Sub PP_CallBack()
MsgBox("Process complete!")
End Sub
На видео будет видно, что в первый раз запускается процедура, но форма виснет! Да и весь AutoCAD тоже.
Во второй раз когда я запускаю уже с формы, как будет видно (ту же самую процедуру), то не виснет (лишь немного тормозит).
Please, help!