VB.net Thread, Invoke, Delegate понятным языком
Вставка
- Опубліковано 30 вер 2024
- Пробуем создавать простой поток(процесс) в учебных целях. Учимся синхронизировать процессы.
Скачать проект тут:
vb2010.ru/Threa...
Скачать Бесплатный Visual Basic, который используется в этом видео можно здесь:
vb2010.ru/vb_we...
Спасибо большое, очень полезное видео!
Андрей, огромное спасибо за урок!
Давно искал нечто подобное на русском и понятном языке, но не было альтернатив и до этого приходилось учиться на буржуйских видео, что жутко напрягало.
Андрей, у меня к Вам огромная просьба, рассмотрите пожалуйста в одном из следующих уроков случай с потоками, когда скажем программа в 10 потоков записывает что-то в ТХТ файл.
Когда один отдельный от основного поток пишет в ТХТ файл это понятно, а вот когда 10 потоков, не совсем понимаю. Теоретически все эти 10 потоков могут ломануться одновременно в этот несчастный ТХТ файл и произойдет.... что-то))) Их нужно будет как-то дополнительно синхронизировать? Думаю многим будет очень интересно рассмотрение данного вопроса.
Жму Вам руку, отличные уроки. Подписался на канал и с удовольствием буду смотреть все уроки.
Огромное спасибо!
Для записи файл нужно открыть. Первый поток это и сделает. А другие потоки не смогут открыть этот файл и крашнутся.
Очень хорошое видео. Недавно брал данные из микроконтроллера. Но при опроса данных с промежутке времени 1 секунд интерфейс программы зависает. Что можете посоветовать?
Thanks
Андрей подскожите по визуал бейсику надо составить программу биоритмов человека ну и прописывать все через дату (линии у меня поле вводя данных рисует а кривую нет, может формула не верная, рисую не в пикселях)
Вот программа
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
вся программа....
операторы, могу скинють фото
Я бы проверил для начала, что получается в переменных x,d,c, правильно ли у них все получается с datepart и datediff, вероятнее всего, там что-то неожиданное происходит. А если там все нормально, то можно проверить формулу, например для начала её упростить, посмотреть на результат и постепенно усложнять.
Доброго времени суток, Андрей!
У меня возник вопрос, для чего нужна проверка, что поток является родным/чужим, если можно сразу отправить запрос на выполнение из родного потока?
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
Спасибо за видео урок! но что будет если нужно запустить несколько потоков поочередно - с ожиданием завершения предыдущего? в этом случае форма будет подвисать с использованием .Join()
Андрей, очень интересно и понятно!
В ютюбе нет видео о создании конверторов и работы с туториалами на русском языке! Буду благодарен если выложишь видео!
Спасибо за видео очень познавательно. Однако я столкнулся одной большой проблемой. мне нужно выполнить процедуру которая находится в модуле, и на форме показать, допустим, прогресс бар. Все хорошо выполняется(процедура), однако прогресс бар не сдвигается с места...
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
Помогите пожалуйста, в чем может быть дело?
Разобрался) может кому и пригодится.
форма:
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
Perfektno Spasiva!
Очень наглядно и понятно!
Спасибо!