打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
带有消息机制的线程
goodwangLib
>《多线程》
2014.03.25
关注
{
public
partial
class
Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
CustomMessageQueue myMsgQueue;
private
bool
CustomMessageProc(
ref
CustomMessage m)
{
if
(m.Message
==
1
)
{
MessageBox.Show(
"
我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵
"
);
return
true
;
}
else
{
MessageBox.Show(m.Message.ToString());
}
return
false
;
}
private
void
Button1_Click(
object
sender, EventArgs e)
{
CustomMessage msg
=
new
CustomMessage();
msg.Message
=
1
;
msg.param
=
"
我的自定义消息 ID:1
"
;
CustomMessageQueue.PostMessage(
ref
myMsgQueue,
ref
msg);
}
private
void
Button2_Click(
object
sender, EventArgs e)
{
CustomMessage msg
=
new
CustomMessage();
msg.Message
=
2
;
myMsgQueue.PostMessage(
ref
msg);
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
myMsgQueue
=
new
CustomMessageQueue();
myMsgQueue.StartThread();
myMsgQueue.PerTranslateMessage
=
new
CustomMessageQueue.PerTranslateMessageHandler(CustomMessageProc);
}
private
void
Form1_FormClosing(
object
sender, FormClosingEventArgs e)
{
myMsgQueue.PostQuitMessage();
}
}
#region
自定义消息队列线程
public
struct
CustomMessage
{
public
int
Message;
public
Object param;
}
public
class
CustomMessageQueue
{
private
System.Threading.Thread th;
public
CustomMessage Msg
=
new
CustomMessage();
public
delegate
bool
PerTranslateMessageHandler(
ref
CustomMessage m);
public
PerTranslateMessageHandler PerTranslateMessage;
public
static
void
PostMessage(
ref
CustomMessageQueue msgQueue,
ref
CustomMessage m)
{
msgQueue.Msg
=
m;
System.Threading.Monitor.Enter(msgQueue);
System.Threading.Monitor.Pulse(msgQueue);
System.Threading.Monitor.Exit(msgQueue);
}
public
void
PostMessage(
ref
CustomMessage m)
{
Msg
=
m;
System.Threading.Monitor.Enter(
this
);
System.Threading.Monitor.Pulse(
this
);
System.Threading.Monitor.Exit(
this
);
}
public
void
PostQuitMessage()
{
Msg.Message
=
-
1
;
System.Threading.Monitor.Enter(
this
);
System.Threading.Monitor.Pulse(
this
);
System.Threading.Monitor.Exit(
this
);
}
private
void
ThreadProc()
{
while
(Msg.Message
!=
-
1
)
//
enum -1 for exit thread
{
if
(Msg.Message
!=
0
)
{
if
(PerTranslateMessage
!=
null
)
{
if
(PerTranslateMessage.Invoke(
ref
Msg))
{
Msg.Message
=
0
;
//
Set message to unused
System.Threading.Monitor.Enter(
this
);
System.Threading.Monitor.Wait(
this
);
System.Threading.Monitor.Exit(
this
);
continue
;
}
}
DefaultMessageTranslate();
}
System.Threading.Monitor.Enter(
this
);
System.Threading.Monitor.Wait(
this
);
System.Threading.Monitor.Exit(
this
);
}
}
private
void
DefaultMessageTranslate()
{
//
以下可以定义默认的消息处理,可以封装成自己要用的
switch
(Msg.Message)
{
case
1
:
//
我自己定义,1表示显示消息号或消息的解释
if
(Msg.param
!=
null
)
{
if
(Msg.param
is
string
)
{
MessageBox.Show(Msg.param
as
string
);
}
}
else
{
string
strMsg
=
string
.Format(
"
{0:d}
"
, Msg.Message);
MessageBox.Show(strMsg);
}
break
;
}
Msg.Message
=
0
;
//
Set message to unused
}
public
CustomMessageQueue()
{
th
=
new
System.Threading.Thread(
new
System.Threading.ThreadStart(ThreadProc));
PerTranslateMessage
=
null
;
}
public
void
StartThread()
{
try
{
th.Start();
}
catch
{
int
nLayer
=
GC.GetGeneration(th);
GC.Collect(nLayer);
th
=
new
System.Threading.Thread(
new
System.Threading.ThreadStart(ThreadProc));
th.Start();
}
}
}
#endregion
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
C#线程系列讲座(5):同步技术之Monitor - 哈佛校训 - 博客园
多线程编程(2):线程的同步
如何在多线程中调用winform窗体控件
spring总结
Windows Message Pump一种C++实现【转】
c# How do you prevent a windows form being moved?
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×