`
yuanlanxiaup
  • 浏览: 858967 次
文章分类
社区版块
存档分类
最新评论

带有消息机制的线程 - CustomMessageQueue

 
阅读更多

调用方法:

PublicClassForm1ClassForm1
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

自己的消息机制线程类

PublicStructureCustomMessageStructureCustomMessage
PublicMessageAsInteger
PublicparamAsObject
EndStructure


PublicClassCustomMessageQueueClassCustomMessageQueue
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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics