Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Thread's: сигнализация.


Автор: Piphon 23.10.2006, 18:59
Как из контекста процессов thread_1, thread_2 и т.п. вызвать событие в контексте процесса thread_event, например для выполнения некого действия. Если можно то пример.

P.S. thread_n выполняет что-то, и о ходе работы сообщает thread_event. Тот в свою очередь пишит в лог.

Автор: Exception 23.10.2006, 21:24
События из потоков вызываются тем же способом, что и обычные. Поконкретнее проблемку можно?

Автор: Piphon 23.10.2006, 23:09
Мне нужен механизм взаимодействия нескольких потоков с одним (без блокировок). т.е:
  • process_n вызывает событие и продолжает свое выполнение.
  • process_event обробатывает это событие.

Автор: Piphon 24.10.2006, 00:11
Решил... Всего-то надо было поработать со стеком.

Автор: Exception 24.10.2006, 01:06
А кодом поделиться?

Автор: Piphon 24.10.2006, 22:15
А вот и код.

Module1         - тестовое приложение.
ThreadObject - тестовый поток.
ThreadEvents - поток для обработки событий.

Код

Module Module1


    Sub Main()
        Dim th_log As ThreadEvents(Of String())
        Dim i As Integer
        th_log = New ThreadEvents(Of String())(AddressOf ConsoleWriteInContext)

        For i = 0 To 1
            Dim th As ThreadObject
            th = New ThreadObject(i, th_log)
        Next
    End Sub

    Sub ConsoleWriteInContext(ByVal str As String())
        Dim th_name As String
        th_name = Threading.Thread.CurrentThread.Name
        Console.WriteLine("To {0} from {1}: {2}", th_name, str(0), str(1))
    End Sub

End Module

Class ThreadEvents(Of T)
    Dim thread As New Threading.Thread(AddressOf Listing)
    Dim stack As New Stack(Of T)
    Dim func As ThreadEventRun
    Public Delegate Sub ThreadEventRun(ByVal e As T)

    Sub New(ByVal Func As ThreadEventRun)
        Me.func = Func
        thread.Name = "Event"
        thread.Start()
    End Sub

    Sub AddEvent(ByVal e As T)
        stack.Push(e)
    End Sub

    Private Sub Listing()
        Do
            If stack.Count > 0 Then
                func.Invoke(stack.Pop)
            Else
                Threading.Thread.Sleep(300)
            End If
        Loop
    End Sub
End Class

Class ThreadObject
    Dim th As ThreadEvents(Of String())
    Dim thread As New Threading.Thread(AddressOf Wait)
    Private Shared r As New Random

    Sub New(ByVal Index As Integer, ByVal Th As ThreadEvents(Of String()))
        Me.th = Th
        thread.Name = "Object #" & Index
        thread.IsBackground = True
        thread.Start()
    End Sub

    Sub Wait()
        Dim i, j As Integer

        For i = 0 To 10
            j = r.Next(1000)
            Threading.Thread.Sleep(j)
            th.AddEvent(New String() {Threading.Thread.CurrentThread.Name, j.ToString})
        Next
    End Sub
End Class

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)