Многопоточность в графических программах
Наше обсуждение многопоточности в приложениях с графическим интерфейсом начнется с примера, поясняющего, для чего нужна многопоточность в графических приложениях. Создайте форму с двумя кнопками Start (btnStart) и Cancel (btnCancel), как показано на рис. 10.9. При нажатии кнопки Start создается класс, который содержит случайную строку из 10 миллионов символов и метод для подсчета вхождений буквы "Е" в этой длинной строке. Обратите внимание на применение класса StringBuilder, повышающего эффективность создания длинных строк.
Шаг 1
Поток 1 замечает, что данных для него нет. Он вызывает Wait, снимает блокировку и переходит в очередь ожидания.
Шаг 2
При снятии блокировки поток 2 или поток 3 выходит из очереди блокировки и входит в синхронизированный блок, устанавливая блокировку.
Шаг3
Допустим, поток 3 входит в синхронизированный блок, создает данные и вызывает Pulse-Pulse All.
Сразу же после его выхода из блока и снятия блокировки поток 1 перемещается в очередь выполнения. Если поток 3 вызывает Pluse, в очередь выполнения переходит только один поток, при вызове Pluse All в очередь выполнения переходят все потоки.
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 m_count += 1 End If Next m_CountDone = True End Sub Public Readonly Property GetCount() As Integer Get If Not (m_CountDone) Then Throw New Exception("Count not yet done") Else Return m_count End If End Get End Property Public Readonly Property IsDone()As Boolean Get Return m_CountDone End Get End Property End Class