Ожидание потока - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Всем привет! Мужики, помогите сделать наиболее правильно. Суть такая. Есть основная форма. На основной форме кнопка. Нажимаем кнопку на основной форме, запускается процедура (Sub1) запускающая класс в потоке, который кое-что выполняет и вызывает ещё одну форму(Form2). Нужно ждать пока в Form2 не будет нажата кнопка, пока этого не произойдет, код основной формы после Sub1 выполнять нельзя. После нажатия кнопки в Form2 необходимо продолжить выполнение кода основной формы. Проблема вот в чем. Из главной формы через Sub1, класс вызывается в отдельном потоке, поэтому не дожидаясь завершения Sub1, начинает выполняться код, который идет ниже Sub1. Join() не подходит. Пробовал после Sub1 вставить бесконечный цикл while с флагом true или false, который меняется после нажатия на кнопку во второй форме, условно говоря такой вариант работает, но фризит первую форму, что не годится. Да и колхозный велосипед это. Какие есть ещё варианты? Схематично код выглядит так
Листинг программы
  1. Public Class Form1
  2. 'Public flagExitWhile As Boolean
  3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4. 'flagExitWhile = False
  5. Sub1() 'Запуск класса в отдельном потоке
  6. 'Здесь нужно ждать...
  7. 'Если вставить while, то получаем зависание.
  8. 'While flagExitWhile = False
  9. 'End While
  10.  
  11. 'Этот код нельзя выполнять, пока в Form2 вызванной из MyCls не будет нажата кнопка
  12. Dim b1, b2, b3 As Integer
  13. b1 = 100
  14. b2 = 100
  15. b3 = b1 + b2
  16. End Sub
  17.  
  18. Public Sub Sub1()
  19. Dim cl As New MyCls
  20. 'cl.run()
  21. End Sub
  22. End Class
  23. Public Class MyCls
  24. 'Тут поток
  25. 'Куча тяжелых процедур
  26. 'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
  27. End Class
  28. 'Public Class Form2
  29. ' 'Тут кнопка и при нажатии flagExitWhile = true
  30. 'End Class

Решение задачи: «Ожидание потока»

textual
Листинг программы
  1. Public Class Form1
  2.  
  3.     Private Delegate Sub _runThread()
  4.  
  5.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  6.         Dim th As New _runThread(AddressOf Sub1) 'зпуск потока
  7.         th.BeginInvoke(Nothing, Nothing)
  8.     End Sub
  9.  
  10.     'вызывается из под дочернего потока после завршения работы
  11.     Private Sub DoNext()
  12.         Dim b1, b2, b3 As Integer
  13.         b1 = 100
  14.         b2 = 100
  15.         b3 = b1 + b2
  16.     End Sub
  17.  
  18.     Public Sub Sub1()
  19.         Dim cl As New MyCls
  20.         'cl.run()
  21.  
  22.         'MyCls должен вызывать форму при помощи  ShowDialog
  23.         Me.Invoke(New MethodInvoker(AddressOf DoNext))
  24.     End Sub
  25.  
  26. End Class
  27.  
  28. Public Class MyCls
  29.     'Тут поток
  30.     'Куча тяжелых процедур
  31.     'Вызов Form2 с кнопкой, нажав на кнопку код после Sub1() на Form1 должен продолжиться
  32. End Class
  33.  
  34. 'Public Class Form2
  35.  
  36. 'Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  37. '    Me.DialogResult = Windows.Forms.DialogResult.OK
  38. 'End Sub
  39.  
  40. 'End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы