Иллюстрированный самоучитель по VB.NET



Тимофей Кургин

Многопоточность в графических программах


Многопоточность в графических программах

Наше обсуждение многопоточности в приложениях с графическим интерфейсом начнется с примера, поясняющего, для чего нужна многопоточность в графических приложениях. Создайте форму с двумя кнопками Start (btnStart) и Cancel (btnCancel), как показано на рис. 10.9. При нажатии кнопки Start создается класс, который содержит случайную строку из 10 миллионов символов и метод для подсчета вхождений буквы «Е» в этой длинной строке. Обратите внимание на применение класса StringBuilder, повышающего эффективность создания длинных строк.

Шаг 1

Поток 1 замечает, что данных для него нет. Он вызывает Wait, снимает блокировку и переходит в очередь ожидания


Шаг 2

При снятии блокировки поток 2 или поток 3 выходит из очереди блокировки и входит в синхронизированный блок, устанавливая блокировку

ШагЗ

Допустим, поток 3 входит в синхронизированный блок, создает данные и вызывает Pulse-Pulse All.

Сразу же после его выхода из блока и снятия блокировки поток 1 перемещается в очередь выполнения. Если поток 3 вызывает Pluse, в очередь выполнения переходит только один поток, при вызове Pluse All в очередь выполнения переходят все потоки.


Рис. 10.8. Проблема «поставщик/потребитель»

Рис. 10.9. Многопоточность в простом приложении с графическим интерфейсом

Imports System.Text

Public Class RandomCharacters

Private m_Data As StringBuilder

Private m_CountDone As Boolean

Private mjength, m_count As Integer

Public Sub New(ByVal n As Integer)

m_Length = n -1

m_Data = New StringBuilder(m_length) MakeString()

End Sub

Private Sub MakeString()

Dim i As Integer

Dim myRnd As New Random()

For i = 0 To m_length

' Сгенерировать случайное число от 65 до 90,

' преобразовать его в прописную букву

' и присоединить к объекту StringBuilder

m_Data.Append(Chr(myRnd.Next(65.90)))

Next

End Sub

Public Sub StartCount()

GetEes()

End Sub

Private Sub GetEes()

Dim i As Integer

For i = 0 To m_length

If m_Data.Chars(i) = CChar("E") Then



Содержание  Назад  Вперед