none
线程中触发事件的问题? RRS feed

  • 问题

  • 在一个类中有两个线程,主线程和后台辅助线程

    后台线程在特定的时候需要触发类中的一个事件

    能不能让后台线程发出一个指令,让主线程去触发事件,而不是直接由后台线程触发?

     

     

    2008年8月31日 7:30

答案

  • Code Snippet

    Public Event MainEvent(ByVal str As String)
        Dim calevent As New ManualResetEvent(False)
        Private Sub DoMain()
            AddHandler MainEvent, AddressOf DoMainEvent

            While (True)
                If (calevent.WaitOne(100, False)) Then
                    calevent.Reset()
                    RaiseEvent MainEvent("test")
                End If
                Debug.Print(Thread.CurrentThread.Name)
            End While
        End Sub
        Private Sub DoBack()

            Thread.Sleep(3000)
            Debug.Print(Thread.CurrentThread.Name)
            calevent.Set()

        End Sub
        Private Sub DoMainEvent(ByVal str As String)
            Debug.Print(Thread.CurrentThread.Name & ";" & str)
        End Sub

     

            Dim mainThread As New Thread(AddressOf DoMain)
            mainThread.Name = "main"
            mainThread.Start()

            Dim backThread As New Thread(AddressOf DoBack)
            backThread.Name = "back"
            backThread.Start()

     

     

    2008年9月5日 7:07
    版主

全部回复

  • 你好,我觉得你可以通过delegate可以实现相应的操作。


    2008年9月2日 3:58
  • 你好,能够说清楚点吗?最好用贴一段简单点的源码,把原理和实现说清楚,谢谢

    2008年9月4日 3:56
  • Code Snippet

    Public Event MainEvent(ByVal str As String)
        Dim calevent As New ManualResetEvent(False)
        Private Sub DoMain()
            AddHandler MainEvent, AddressOf DoMainEvent

            While (True)
                If (calevent.WaitOne(100, False)) Then
                    calevent.Reset()
                    RaiseEvent MainEvent("test")
                End If
                Debug.Print(Thread.CurrentThread.Name)
            End While
        End Sub
        Private Sub DoBack()

            Thread.Sleep(3000)
            Debug.Print(Thread.CurrentThread.Name)
            calevent.Set()

        End Sub
        Private Sub DoMainEvent(ByVal str As String)
            Debug.Print(Thread.CurrentThread.Name & ";" & str)
        End Sub

     

            Dim mainThread As New Thread(AddressOf DoMain)
            mainThread.Name = "main"
            mainThread.Start()

            Dim backThread As New Thread(AddressOf DoBack)
            backThread.Name = "back"
            backThread.Start()

     

     

    2008年9月5日 7:07
    版主