PublicClass Form1Class Form1 Private myMsgQueue As CustomMessageQueue PrivateSub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim msg AsNew CustomMessage msg.Message =1 msg.param =NewString("我的自定义消息 ID:1") CustomMessageQueue.PostMessage(myMsgQueue, msg) End Sub PrivateSub Button2_Click()Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim msg AsNew CustomMessage msg.Message =2 myMsgQueue.PostMessage(msg) End Sub PrivateSub Form1_FormClosing()Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) HandlesMyBase.FormClosing myMsgQueue.PostQuitMessage() End Sub PrivateSub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load myMsgQueue =New CustomMessageQueue() myMsgQueue.StartThread() myMsgQueue.PerTranslateMessage =New CustomMessageQueue.PerTranslateMessageHandler(AddressOf CustomMessageProc) End Sub PrivateFunction CustomMessageProc()Function CustomMessageProc(ByRef m As CustomMessage) AsBoolean If m.Message =1Then MessageBox.Show("我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵") ReturnTrue Else MessageBox.Show(m.Message.ToString) EndIf ReturnFalse End Function End Class
自己的消息机制线程类
PublicStructure CustomMessageStructure CustomMessage Public Message AsInteger Public param AsObject End Structure PublicClass CustomMessageQueueClass CustomMessageQueue Private th As Threading.Thread Public Msg AsNew CustomMessage PublicDelegateFunction PerTranslateMessageHandler()Function PerTranslateMessageHandler(ByRef m As CustomMessage) AsBoolean Public PerTranslateMessage As PerTranslateMessageHandler PublicSharedSub 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 PublicSub PostMessage()Sub PostMessage(ByRef m As CustomMessage) Msg = m Threading.Monitor.Enter(Me) Threading.Monitor.Pulse(Me) Threading.Monitor.Exit(Me) End Sub PublicSub PostQuitMessage()Sub PostQuitMessage() Msg.Message =-1 Threading.Monitor.Enter(Me) Threading.Monitor.Pulse(Me) Threading.Monitor.Exit(Me) End Sub PrivateSub ThreadProc()Sub ThreadProc() While Msg.Message <>-1'enum -1 for exit thread If (Msg.Message <>0) Then IfNot PerTranslateMessage IsNothingThen If PerTranslateMessage.Invoke(Msg) Then Msg.Message =0'Set message to unused Threading.Monitor.Enter(Me) Threading.Monitor.Wait(Me) Threading.Monitor.Exit(Me) ContinueWhile EndIf EndIf DefaultMessageTranslate() EndIf Threading.Monitor.Enter(Me) Threading.Monitor.Wait(Me) Threading.Monitor.Exit(Me) EndWhile End Sub PrivateSub DefaultMessageTranslate()Sub DefaultMessageTranslate() '以下可以定义默认的消息处理,可以封装成自己要用的 SelectCase Msg.Message Case1'我自己定义,1表示显示消息号或消息的解释 IfNot Msg.param IsNothingOrElseTypeOf Msg.param IsStringThen MessageBox.Show(DirectCast(Msg.param, String)) Else Dim strMsg AsString=String.Format("{0:d}", Msg.Message) MessageBox.Show(strMsg) EndIf EndSelect Msg.Message =0'Set message to unused End Sub PublicSub New()SubNew() th =New Threading.Thread(AddressOf ThreadProc) PerTranslateMessage =Nothing End Sub PublicSub StartThread()Sub StartThread() Try th.Start() Catch Dim nLayer AsInteger= GC.GetGeneration(th) GC.Collect(nLayer) th =New Threading.Thread(AddressOf ThreadProc) th.Start() EndTry End Sub End Class