Ожидание потока - Visual Basic .NET
Формулировка задачи:
Всем привет!
Мужики, помогите сделать наиболее правильно.
Суть такая.
Есть основная форма.
На основной форме кнопка.
Нажимаем кнопку на основной форме, запускается процедура (Sub1) запускающая класс в потоке, который кое-что выполняет и вызывает ещё одну форму(Form2).
Нужно ждать пока в Form2 не будет нажата кнопка, пока этого не произойдет, код основной формы после Sub1 выполнять нельзя.
После нажатия кнопки в Form2 необходимо продолжить выполнение кода основной формы.
Проблема вот в чем.
Из главной формы через Sub1, класс вызывается в отдельном потоке, поэтому не дожидаясь завершения Sub1, начинает выполняться код, который идет ниже Sub1.
Join() не подходит.
Пробовал после Sub1 вставить бесконечный цикл while с флагом true или false, который меняется после нажатия на кнопку во второй форме, условно говоря такой вариант работает, но фризит первую форму, что не годится. Да и колхозный велосипед это.
Какие есть ещё варианты?
Схематично код выглядит так
Листинг программы
- Public Class Form1
- 'Public flagExitWhile As Boolean
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- 'flagExitWhile = False
- Sub1() 'Запуск класса в отдельном потоке
- 'Здесь нужно ждать...
- 'Если вставить while, то получаем зависание.
- 'While flagExitWhile = False
- 'End While
- 'Этот код нельзя выполнять, пока в Form2 вызванной из MyCls не будет нажата кнопка
- Dim b1, b2, b3 As Integer
- b1 = 100
- b2 = 100
- b3 = b1 + b2
- End Sub
- Public Sub Sub1()
- Dim cl As New MyCls
- 'cl.run()
- End Sub
- End Class
- Public Class MyCls
- 'Тут поток
- 'Куча тяжелых процедур
- 'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
- End Class
- 'Public Class Form2
- ' 'Тут кнопка и при нажатии flagExitWhile = true
- 'End Class
Решение задачи: «Ожидание потока»
textual
Листинг программы
- Public Class Form1
- Private Delegate Sub _runThread()
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim th As New _runThread(AddressOf Sub1) 'зпуск потока
- th.BeginInvoke(Nothing, Nothing)
- End Sub
- 'вызывается из под дочернего потока после завршения работы
- Private Sub DoNext()
- Dim b1, b2, b3 As Integer
- b1 = 100
- b2 = 100
- b3 = b1 + b2
- End Sub
- Public Sub Sub1()
- Dim cl As New MyCls
- 'cl.run()
- 'MyCls должен вызывать форму при помощи ShowDialog
- Me.Invoke(New MethodInvoker(AddressOf DoNext))
- End Sub
- End Class
- Public Class MyCls
- 'Тут поток
- 'Куча тяжелых процедур
- 'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
- End Class
- 'Public Class Form2
- 'Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- ' Me.DialogResult = Windows.Forms.DialogResult.OK
- 'End Sub
- 'End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д