VB.net Thread, Invoke, Delegate понятным языком

Поділитися
Вставка
  • Опубліковано 30 вер 2024
  • Пробуем создавать простой поток(процесс) в учебных целях. Учимся синхронизировать процессы.
    Скачать проект тут:
    vb2010.ru/Threa...
    Скачать Бесплатный Visual Basic, который используется в этом видео можно здесь:
    vb2010.ru/vb_we...

КОМЕНТАРІ • 15

  • @Jajdushii
    @Jajdushii 3 роки тому +2

    Спасибо большое, очень полезное видео!

  • @АлександрДанилов-ф9к
    @АлександрДанилов-ф9к 9 років тому +3

    Андрей, огромное спасибо за урок!
    Давно искал нечто подобное на русском и понятном языке, но не было альтернатив и до этого приходилось учиться на буржуйских видео, что жутко напрягало.
    Андрей, у меня к Вам огромная просьба, рассмотрите пожалуйста в одном из следующих уроков случай с потоками, когда скажем программа в 10 потоков записывает что-то в ТХТ файл.
    Когда один отдельный от основного поток пишет в ТХТ файл это понятно, а вот когда 10 потоков, не совсем понимаю. Теоретически все эти 10 потоков могут ломануться одновременно в этот несчастный ТХТ файл и произойдет.... что-то))) Их нужно будет как-то дополнительно синхронизировать? Думаю многим будет очень интересно рассмотрение данного вопроса.
    Жму Вам руку, отличные уроки. Подписался на канал и с удовольствием буду смотреть все уроки.
    Огромное спасибо!

    • @ВладиславКолосов-ъ1й
      @ВладиславКолосов-ъ1й 5 років тому

      Для записи файл нужно открыть. Первый поток это и сделает. А другие потоки не смогут открыть этот файл и крашнутся.

  • @ruslan.zhumabai
    @ruslan.zhumabai 3 роки тому

    Очень хорошое видео. Недавно брал данные из микроконтроллера. Но при опроса данных с промежутке времени 1 секунд интерфейс программы зависает. Что можете посоветовать?

  • @gaetanovignale7117
    @gaetanovignale7117 4 роки тому

    Thanks

  • @alexlex6974
    @alexlex6974 9 років тому +1

    Андрей подскожите по визуал бейсику надо составить программу биоритмов человека ну и прописывать все через дату (линии у меня поле вводя данных рисует а кривую нет, может формула не верная, рисую не в пикселях)
    Вот программа
    Dim a, b, d As Date
    Private Sub Command2_Click()
    a = Text1.Text
    b = Text2.Text
    x = DatePart("d", b)
    d = DateAdd("d", -x + 1, b)
    c = DateDiff("d", a, b)
    Picture1.Line (0, 962)-(4095, 962)
    Picture2.Line (0, 962)-(4095, 962)
    Picture3.Line (0, 962)-(4095, 962)
    For t = 0 To 31
    Picture1.PSet (t * 1365, 100 * Sin(6.28 * (t + y) * (23 + 962))), RGB(254, 234, 55)
    Next t
    End Sub
    вся программа....
    операторы, могу скинють фото

    • @MrQuantum18
      @MrQuantum18  9 років тому

      Я бы проверил для начала, что получается в переменных x,d,c, правильно ли у них все получается с datepart и datediff, вероятнее всего, там что-то неожиданное происходит. А если там все нормально, то можно проверить формулу, например для начала её упростить, посмотреть на результат и постепенно усложнять.

  • @ekve9
    @ekve9 7 років тому

    Доброго времени суток, Андрей!
    У меня возник вопрос, для чего нужна проверка, что поток является родным/чужим, если можно сразу отправить запрос на выполнение из родного потока?
    Imports System.Threading
    Public Class Form1
    Dim ThreadTwo As Thread
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If IsNothing(ThreadTwo) Then
    ThreadTwo = New Thread(AddressOf TheadTwoPerformer)
    ThreadTwo.Name = "ThreadTwo"
    ThreadTwo.IsBackground = True
    ThreadTwo.Start()
    Else
    If Not ThreadTwo.IsAlive Then
    ThreadTwo = New Thread(AddressOf TheadTwoPerformer)
    ThreadTwo.Name = "ThreadTwo"
    ThreadTwo.IsBackground = True
    ThreadTwo.Start()
    End If
    End If
    End Sub
    Private Delegate Sub DelegateRealtor(i As Integer)
    Sub TheadTwoPerformer()
    For i As Integer = 1 To 1000
    Thread.Sleep(10)
    AuditCommunicationData(i)
    Me.Invoke(New DelegateRealtor(AddressOf AuditCommunicationData), i)
    Next i
    End Sub
    Sub AuditCommunicationData(i As Integer)
    TextBox1.Text = i
    End Sub
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    ThreadTwo.Abort()
    End Sub
    End Class

  • @IZHGTUmekhanik
    @IZHGTUmekhanik 5 років тому

    Спасибо за видео урок! но что будет если нужно запустить несколько потоков поочередно - с ожиданием завершения предыдущего? в этом случае форма будет подвисать с использованием .Join()

  • @НиколайСырбу-я2ь
    @НиколайСырбу-я2ь 9 років тому

    Андрей, очень интересно и понятно!
    В ютюбе нет видео о создании конверторов и работы с туториалами на русском языке! Буду благодарен если выложишь видео!

  • @Mickey6X6
    @Mickey6X6 7 років тому +2

    Спасибо за видео очень познавательно. Однако я столкнулся одной большой проблемой. мне нужно выполнить процедуру которая находится в модуле, и на форме показать, допустим, прогресс бар. Все хорошо выполняется(процедура), однако прогресс бар не сдвигается с места...
    Imports System.Threading
    Public Class Form1
    Public Delegate Sub Del1(ByVal a As Integer)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Trd As New Thread(AddressOf sub1)
    Trd.IsBackground = True
    Trd.Start()
    End Sub
    Public Sub Progress(ByVal A As Integer)
    If ProgressBar1.InvokeRequired Then
    Me.Invoke(New Del1(AddressOf Progress), A)
    Else
    ProgressBar1.Value = A
    End If
    End Sub
    End Class
    И вот процедура в модуле:
    Imports System.Threading
    Module Module1
    Public Sub sub1()
    For i = 0 To 100 Step 10
    Form1.Progress(i)
    Beep()
    Thread.Sleep(1000)
    Next
    End Sub
    End Module
    Помогите пожалуйста, в чем может быть дело?

    • @Mickey6X6
      @Mickey6X6 7 років тому

      Разобрался) может кому и пригодится.
      форма:
      Imports System.Threading
      Public Class Form1
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim trd As New Thread(New ThreadStart(Sub() Sub1(Me)))
      trd.IsBackground = True
      trd.Start()
      End Sub
      End Class
      модуль:
      Imports System.Threading
      Module Module1
      Public Delegate Sub Del1(ByVal A As Integer, ByVal T As Form1)
      Public Sub Sub1(ByVal T As Form1)
      For i = 0 To 100 Step 10
      SetProgress(i, T)
      Thread.Sleep(1000)
      Next
      End Sub
      Public Sub SetProgress(ByVal A As Integer, ByVal T As Form1)
      If T.ProgressBar1.InvokeRequired Then
      T.ProgressBar1.Invoke(New Del1(AddressOf SetProgress), A, T)
      Else
      T.ProgressBar1.Value = A
      End If
      End Sub
      End Module

  • @brazo98
    @brazo98 6 років тому

    Perfektno Spasiva!

  • @ventuks
    @ventuks 9 років тому

    Очень наглядно и понятно!
    Спасибо!