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

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

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

Всем привет! Мужики, помогите сделать наиболее правильно. Суть такая. Есть основная форма. На основной форме кнопка. Нажимаем кнопку на основной форме, запускается процедура (Sub1) запускающая класс в потоке, который кое-что выполняет и вызывает ещё одну форму(Form2). Нужно ждать пока в Form2 не будет нажата кнопка, пока этого не произойдет, код основной формы после Sub1 выполнять нельзя. После нажатия кнопки в Form2 необходимо продолжить выполнение кода основной формы. Проблема вот в чем. Из главной формы через Sub1, класс вызывается в отдельном потоке, поэтому не дожидаясь завершения Sub1, начинает выполняться код, который идет ниже Sub1. Join() не подходит. Пробовал после Sub1 вставить бесконечный цикл while с флагом true или false, который меняется после нажатия на кнопку во второй форме, условно говоря такой вариант работает, но фризит первую форму, что не годится. Да и колхозный велосипед это. Какие есть ещё варианты? Схематично код выглядит так

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

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

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


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

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

8   голосов , оценка 3.625 из 5
Похожие ответы