调用方法:
Public
Class Form1
Class Form1
Private myMsgQueue As CustomMessageQueue
Private Sub Button1_Click()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()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()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()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()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
Private myMsgQueue As CustomMessageQueue
Private Sub Button1_Click()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()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()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()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()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
Structure CustomMessage
Public Message As Integer
Public param As Object
End Structure
Public Class CustomMessageQueue Class CustomMessageQueue
Private th As Threading.Thread
Public Msg As New CustomMessage
Public Delegate Function PerTranslateMessageHandler()Function PerTranslateMessageHandler(ByRef m As CustomMessage) As Boolean
Public PerTranslateMessage As PerTranslateMessageHandler
Public Shared Sub PostMessage()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()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()Sub PostQuitMessage()
Msg.Message = -1
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
End Sub
Private Sub ThreadProc()Sub ThreadProc()
While Msg.Message <> -1 'enum -1 for exit thread
If (Msg.Message <> 0) Then
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()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()Sub New()
th = New Threading.Thread(AddressOf ThreadProc)
PerTranslateMessage = Nothing
End Sub
Public Sub StartThread()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
Public Message As Integer
Public param As Object
End Structure
Public Class CustomMessageQueue Class CustomMessageQueue
Private th As Threading.Thread
Public Msg As New CustomMessage
Public Delegate Function PerTranslateMessageHandler()Function PerTranslateMessageHandler(ByRef m As CustomMessage) As Boolean
Public PerTranslateMessage As PerTranslateMessageHandler
Public Shared Sub PostMessage()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()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()Sub PostQuitMessage()
Msg.Message = -1
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
End Sub
Private Sub ThreadProc()Sub ThreadProc()
While Msg.Message <> -1 'enum -1 for exit thread
If (Msg.Message <> 0) Then
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()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()Sub New()
th = New Threading.Thread(AddressOf ThreadProc)
PerTranslateMessage = Nothing
End Sub
Public Sub StartThread()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