Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: события в другом потоке Добавлено: 07.08.08 18:01  

Автор вопроса:  Skywalker | Web-сайт: iSkywalker.ru | ICQ: 300-70-6пятьЪ 
в одном потоке вызываю события, как из другого потока их отловить?

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 07.08.08 21:56
Если тебе нужно именно то что ты написал, то сделать это нифига непросто.
Я могу дать код.

Подумай, тебе скорее всего это не нужно.

Ответить

Номер ответа: 2
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #2
Добавлено: 07.08.08 22:03
да, я немного переделал и теперь это не требуется

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 07.08.08 22:08
Public Class Service1

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Очищаем журнал
        ClearLog()

        WriteLog("Service start";)

        ' Запускаем основной поток
        Dim MainThread As New Threading.Thread(AddressOf Me.MainThread)
        MainThread.Start()

        ' Запускаем 2 дополнительных потока которые будут генерить события
        Dim OtherThread As New Threading.Thread(AddressOf Me.Thread2)
        OtherThread.Start()
        Dim AnyOtherThread As New Threading.Thread(AddressOf Me.Thread3)
        AnyOtherThread.Start()
    End Sub

    ' Блкоиратор потока
    Dim MEvent As New System.Threading.ManualResetEvent(False)
    ' Очередь событий
    Dim EventsQueue As New Generic.Queue(Of EventInfo)

    Dim [Exit] As Boolean

    Sub MainThread()
        WriteLog("Main thread started";)
        ' Блокируем блокиратор
        MEvent.Reset()
        ' Выполняем цикл пока не будет установлен флаг Exit (для корректного завершения
        ' работы сервиса)
        Do While Not [Exit]
            ' Начинаем ждать разблокировки
            MEvent.WaitOne()
            ' Дождались разблокировки
            ' Включаем блкоиратор
            MEvent.Reset()
            WriteLog("Main thread tick";)
            ' Перебираем содержимое очереди событий и обрабатываем их
            ' В это время очередь событий забловирована поэтому другие потоки которые попробуют
            ' к ней обратиться тоже будут заблокированы, можно немного передлать этот код чтоб
            ' очередь не блокировалась
            SyncLock EventsQueue
                ' проходим по всей очереди
                Do While EventsQueue.Count > 0
                    Dim Ev As EventInfo = EventsQueue.Dequeue
                    WriteLog("Обработано событие " + Ev.EventName)
                Loop
            End SyncLock

        Loop
        WriteLog("Main thread end";)
        MyBase.Stop()
    End Sub

    ' Поток которые генерит события
    Sub Thread2()
        Dim Rnd As New Random()
        WriteLog("Thread2 started";)
        Do While Not [Exit]
            ' Усыпляем поток не некоторое время
            System.Threading.Thread.Sleep(500 + Rnd.Next(1000))
            ' Создаем событие
            Dim Ev As New EventInfo
            Ev.EventName = "одно событие"
            Ev.Arguments = New Object() {DateTime.Now, "гыгыгы"}
            ' Блокируем очередь и добавляем в нее информацию о событии
            SyncLock EventsQueue
                EventsQueue.Enqueue(Ev)
            End SyncLock
            WriteLog("Сгенеро ОДНО СОБЫТИЕ";)
            ' Разблокируем блкоиратор чтоб основной поток мог обработать событие
            MEvent.Set()
        Loop
        WriteLog("Thread2 stopped";)
    End Sub

    ' Поток которые генерит события
    Sub Thread3()
        Dim Rnd As New Random()
        WriteLog("Thread3 started";)
        Do While Not [Exit]
            ' Усыпляем поток не некоторое время
            System.Threading.Thread.Sleep(500 + Rnd.Next(1000))
            Dim Ev As New EventInfo
            Ev.EventName = "другое событие"
            Ev.Arguments = New Object() {10, 20, "hello"}
            ' Блокируем очередь и добавляем в нее информацию о событии
            SyncLock EventsQueue
                EventsQueue.Enqueue(Ev)
            End SyncLock
            WriteLog("Сгенеро ДРУГОЕ СОБЫТИЕ";)
            ' Разблокируем блкоиратор чтоб основной поток мог обработать событие
            MEvent.Set()
        Loop
        WriteLog("Thread3 stopped";)
    End Sub

    ' Для того чтоб корректно остановить основной поток, ставим флаг Exit и разблокируем блокиратор
    Protected Overrides Sub OnStop()
        WriteLog("Stop";)
        Me.Exit = True
        MEvent.Set()
        MyBase.OnStop()
    End Sub

    Protected Overrides Sub OnShutdown()
        Me.OnStop()
    End Sub

    Public Sub ClearLog()
        My.Computer.FileSystem.WriteAllText("c:\service.txt", "", False)
    End Sub

    Public Shared Sub WriteLog(ByVal text As String)
        My.Computer.FileSystem.WriteAllText("c:\service.txt", DateTime.Now.ToString + " Thread" + _
                                            System.Threading.Thread.CurrentThread.ManagedThreadId.ToString + _
                                            " " + text + ControlChars.CrLf, True)
    End Sub

    Class EventInfo
        Public EventName As String
        Public Arguments As Object()
    End Class
End Class


Прийдется тебе заточить под свои цели.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам