带有消息机制的线程 - 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# 两种版本的源码)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值