带有消息机制的线程 - CustomMessageQueue

调用方法:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值