调用方法:
Public
ClassForm1
ClassForm1
PrivatemyMsgQueueAsCustomMessageQueue
PrivateSubButton1_Click()SubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimmsgAsNewCustomMessage
msg.Message=1
msg.param=NewString("我的自定义消息ID:1")
CustomMessageQueue.PostMessage(myMsgQueue,msg)
EndSub

PrivateSubButton2_Click()SubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.Click
DimmsgAsNewCustomMessage
msg.Message=2
myMsgQueue.PostMessage(msg)
EndSub

PrivateSubForm1_FormClosing()SubForm1_FormClosing(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.FormClosingEventArgs)HandlesMyBase.FormClosing
myMsgQueue.PostQuitMessage()
EndSub

PrivateSubForm1_Load()SubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
myMsgQueue=NewCustomMessageQueue()
myMsgQueue.StartThread()
myMsgQueue.PerTranslateMessage=NewCustomMessageQueue.PerTranslateMessageHandler(AddressOfCustomMessageProc)
EndSub

PrivateFunctionCustomMessageProc()FunctionCustomMessageProc(ByRefmAsCustomMessage)AsBoolean
Ifm.Message=1Then
MessageBox.Show("我拦截到id=1的消息了。并且,就到此为止了。呵呵")
ReturnTrue
Else
MessageBox.Show(m.Message.ToString)
EndIf
ReturnFalse
EndFunction
EndClass
自己的消息机制线程类
Public
StructureCustomMessage
StructureCustomMessage
PublicMessageAsInteger
PublicparamAsObject
EndStructure


Public
ClassCustomMessageQueue
ClassCustomMessageQueue
PrivatethAsThreading.Thread
PublicMsgAsNewCustomMessage
PublicDelegateFunctionPerTranslateMessageHandler()FunctionPerTranslateMessageHandler(ByRefmAsCustomMessage)AsBoolean
PublicPerTranslateMessageAsPerTranslateMessageHandler

PublicSharedSubPostMessage()SubPostMessage(ByRefmsgQueueAsCustomMessageQueue,ByRefmAsCustomMessage)
msgQueue.Msg=m
Threading.Monitor.Enter(msgQueue)
Threading.Monitor.Pulse(msgQueue)
Threading.Monitor.Exit(msgQueue)
EndSub

PublicSubPostMessage()SubPostMessage(ByRefmAsCustomMessage)
Msg=m
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
EndSub

PublicSubPostQuitMessage()SubPostQuitMessage()
Msg.Message=-1
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
EndSub

PrivateSubThreadProc()SubThreadProc()
WhileMsg.Message<>-1'enum-1forexitthread
If(Msg.Message<>0)Then
IfNotPerTranslateMessageIsNothingThen
IfPerTranslateMessage.Invoke(Msg)Then
Msg.Message=0'Setmessagetounused
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
EndSub

PrivateSubDefaultMessageTranslate()SubDefaultMessageTranslate()
'以下可以定义默认的消息处理,可以封装成自己要用的
SelectCaseMsg.Message
Case1'我自己定义,1表示显示消息号或消息的解释
IfNotMsg.paramIsNothingOrElseTypeOfMsg.paramIsStringThen
MessageBox.Show(DirectCast(Msg.param,String))
Else
DimstrMsgAsString=String.Format("{0:d}",Msg.Message)
MessageBox.Show(strMsg)
EndIf
EndSelect
Msg.Message=0'Setmessagetounused
EndSub

PublicSubNew()SubNew()
th=NewThreading.Thread(AddressOfThreadProc)
PerTranslateMessage=Nothing
EndSub

PublicSubStartThread()SubStartThread()
Try
th.Start()
Catch
DimnLayerAsInteger=GC.GetGeneration(th)
GC.Collect(nLayer)
th=NewThreading.Thread(AddressOfThreadProc)
th.Start()
EndTry
EndSub
EndClass
本文介绍了一个使用VB.NET实现的自定义消息队列机制,包括消息结构定义、消息队列类构造及消息处理流程。该机制支持消息发送、接收、处理及线程管理等功能。
6495

被折叠的 条评论
为什么被折叠?



