.NET конкурентам! Скрыпников Сергей Спецвыпуск: Хакер, номер #053, стр. 053-076-6 Dim TM As New clsThreadManager AddHandler TM.Done, AddressOf DoneHandler Далее для каждого потока создаем рабочего, устанавливаем ему "трудовую норму" :). Dim Worker As New clsWorker Worker.Host = txtHost.Text Worker.FirstPort = (i - 1) * 65536 / ThreadsCount Worker.LastPort = i * 65536 / ThreadsCount - 1 Подписываемся на событие Log, которое будет информировать хозяина о прогрессе в работе -AddHandler Worker.Log, AddressOf LogHandler. Создаем новый поток, скидываем ссылку на него в менеджер потоков (чтобы знал, за кем присматривать) и запускаем поток. Dim t As New Thread(AddressOf Worker.Start) TM.Threads.Add(t) t.Start() И в отдельном потоке запускаем менеджер потоков: Dim TMThread As New Thread(AddressOf TM.JoinThreads) TMThread.Start() Также в frmMain определены две процедуры, обработчики событий Log и Done. Их не обязательно комментировать. Public Sub LogHandler(ByVal Port As Int32, ByVal Opened As Boolean) SyncLock Me PortsList(Port) = Opened PortsScanned += 1 lblProgress1.Text = "Отсканировано " & PortsScanned.ToString & " портов" lblProgress2.Text = "Сканируется порт " & Port.ToString End SyncLock End Sub Public Sub DoneHandler() Dim sb As New System.Text.StringBuilder For i As Int32 = 1 To 65536 If PortsList(i) = True Then sb.Append("Порт " & i.ToString & " открыт" & ControlChars.CrLf) End If Next txtLog.Text = sb.ToString MessageBox.Show("Отчет готов!") End Sub Теперь вернемся к менеджеру потоков. Всегда менеджерам жилось лучше, чем рабочим :). Вот и наш менеджер только и делает что следит, отработали ли рабочие свою норму, а в конце рабочего дня рапортует боссу, что работа окончена. Imports System.Threading Public Class clsThreadManager Public Threads As New ArrayList Public Event Done() Public Sub JoinThreads() For Each t As Thread In Threads t.Join() Next RaiseEvent Done() End Sub End Class Вот, собственно, и все. Теперь, надеемся, ты имеешь хотя бы небольшое представление о технологии dot.NET. Начинать пользоваться ею или нет – конечно, личное дело программиста. Но мы на нее перешли и теперь нисколько об этом не жалеем (хотя все зависит от поставленных перед программистом задач). Полный текст программы ты сможешь найти на диске (а также тебя там ждет бонус – NET Framework, который теперь не придется качать). |