带有消息机制的线程 - CustomMessageQueue

 调用方法:

Public   Class Form1
    
Private myMsgQueue As CustomMessageQueue
    
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
Dim msg As New CustomMessage
        msg.Message 
= 1
        msg.param 
= New String("我的自定义消息 ID:1")
        CustomMessageQueue.PostMessage(myMsgQueue, msg)
    
End Sub


    
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        
Dim msg As New CustomMessage
        msg.Message 
= 2
        myMsgQueue.PostMessage(msg)
    
End Sub


    
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        myMsgQueue.PostQuitMessage()
    
End Sub


    
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myMsgQueue 
= New CustomMessageQueue()
        myMsgQueue.StartThread()
        myMsgQueue.PerTranslateMessage 
= New CustomMessageQueue.PerTranslateMessageHandler(AddressOf CustomMessageProc)
    
End Sub


    
Private Function CustomMessageProc(ByRef m As CustomMessage) As Boolean
        
If m.Message = 1 Then
            MessageBox.Show(
"我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵")
            
Return True
        
Else
            MessageBox.Show(m.Message.ToString)
        
End If
        
Return False
    
End Function

End Class

 

 

自己的消息机制线程类

Public   Structure CustomMessage
    
Public Message As Integer
    
Public param As Object
End Structure


Public   Class CustomMessageQueue
    
Private th As Threading.Thread
    
Public Msg As New CustomMessage
    
Public Delegate Function PerTranslateMessageHandler(ByRef m As CustomMessage) As Boolean
    
Public PerTranslateMessage As PerTranslateMessageHandler

    
Public Shared Sub PostMessage(ByRef msgQueue As CustomMessageQueue, ByRef m As CustomMessage)
        msgQueue.Msg 
= m
        Threading.Monitor.Enter(msgQueue)
        Threading.Monitor.Pulse(msgQueue)
        Threading.Monitor.Exit(msgQueue)
    
End Sub


    
Public Sub PostMessage(ByRef m As CustomMessage)
        Msg 
= m
        Threading.Monitor.Enter(
Me)
        Threading.Monitor.Pulse(
Me)
        Threading.Monitor.Exit(
Me)
    
End Sub


    
Public Sub PostQuitMessage()
        Msg.Message 
= -1
        Threading.Monitor.Enter(
Me)
        Threading.Monitor.Pulse(
Me)
        Threading.Monitor.Exit(
Me)
    
End Sub


    
Private Sub ThreadProc()
        
While Msg.Message <> -1 'enum -1 for exit thread
            If (Msg.Message <> 0Then
                
If Not PerTranslateMessage Is Nothing Then
                    
If PerTranslateMessage.Invoke(Msg) Then
                        Msg.Message 
= 0 'Set message to unused
                        Threading.Monitor.Enter(Me)
                        Threading.Monitor.Wait(
Me)
                        Threading.Monitor.Exit(
Me)
                        
Continue While
                    
End If
                
End If
                DefaultMessageTranslate()
            
End If
            Threading.Monitor.Enter(
Me)
            Threading.Monitor.Wait(
Me)
            Threading.Monitor.Exit(
Me)
        
End While
    
End Sub


    
Private Sub DefaultMessageTranslate()
        
'以下可以定义默认的消息处理,可以封装成自己要用的   
        Select Case Msg.Message
            
Case 1 '我自己定义,1表示显示消息号或消息的解释
                If Not Msg.param Is Nothing OrElse TypeOf Msg.param Is String Then
                    MessageBox.Show(
DirectCast(Msg.param, String))
                
Else
                    
Dim strMsg As String = String.Format("{0:d}", Msg.Message)
                    MessageBox.Show(strMsg)
                
End If
        
End Select
        Msg.Message 
= 0 'Set message to unused
    End Sub


    
Public Sub New()
        th 
= New Threading.Thread(AddressOf ThreadProc)
        PerTranslateMessage 
= Nothing
    
End Sub


    
Public Sub StartThread()
        
Try
            th.Start()
        
Catch
            
Dim nLayer As Integer = GC.GetGeneration(th)
            GC.Collect(nLayer)
            th 
= New Threading.Thread(AddressOf ThreadProc)
            th.Start()
        
End Try
    
End Sub

End Class

 

带有消息机制的线程 - CustomMessageQueue (vb.net/c# 两种版本的源码)

你可能感兴趣的:(带有消息机制的线程 - CustomMessageQueue)