//C#语法
...
bool isClose;
public void MessageEngine()
{
while (isClose)
{
//(A处:)监视N个信号,(执行流将一直堵塞在这里,直到获得至少一个信号。
//this.Do(message)
}
}
...
A处,一般有象Console.ReadLine();或windowsObj.ShowDialog()等,我想知道有没有更底层的命令 可以来完成A处,提出的需求,包括使用线程方案等,如果方便的话请不妨给出代码表述。
...
bool isClose;
public void MessageEngine()
{
while (isClose)
{
//(A处:)监视N个信号,(执行流将一直堵塞在这里,直到获得至少一个信号。
//this.Do(message)
}
}
...
A处,一般有象Console.ReadLine();或windowsObj.ShowDialog()等,我想知道有没有更底层的命令 可以来完成A处,提出的需求,包括使用线程方案等,如果方便的话请不妨给出代码表述。
解决方案 »
- SMTP发送带图片的邮件问题
- ASP中的输出参数获值
- 各位 大哥哥 大姐姐 给我讲解下索引到底是什么意思
- ########请问关于WebServer#####, 谢谢了,一直没有人答复
- 关于C#中索引器的实现
- 关于lucene、全文检索、搜索引擎、倒排索引的疑问
- 高难度问题,牛人来哈 48分
- dynamic类型有什么作用?
- 谁来帮帮我,如果有谁能够帮我把以下js代码翻译c#,小弟感激不禁
- 请教高手:用C#如何写CGI程序?
- ArrayList的问题
- 请问哪位知道用webBrowser 或AxWebBrowser怎么样显示贴子的内容吗?有没有类似的例子源码或webBrowser,AxWebBrowser的相关资料也行,能否
Application.AddMessageFilter(IMessageFilter value)
……
……不过就是现在blog打不开,csdn的问题。
Public Structure CustomMessage
Public Message As Integer
Public param As Object
End StructurePublic Class CustomMessageQueue
Private th As Threading.Thread
Public Msg As New CustomMessage
Public Delegate Function PerTranslateMessageHandler(ByRef m As CustomMessage) As Boolean
Public PerTranslateMessage As PerTranslateMessageHandler Public Shared 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 Public Sub PostMessage(ByRef m As CustomMessage)
Msg = m
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
End Sub Public Sub PostQuitMessage()
Msg.Message = -1
Threading.Monitor.Enter(Me)
Threading.Monitor.Pulse(Me)
Threading.Monitor.Exit(Me)
End Sub Private Sub ThreadProc()
While Msg.Message <> -1 'enum -1 for exit thread
If (Msg.Message <> 0) Then
If Not PerTranslateMessage Is Nothing Then
If PerTranslateMessage.Invoke(Msg) Then
Msg.Message = 0 'Set message to unused
Threading.Monitor.Enter(Me)
Threading.Monitor.Wait(Me)
Threading.Monitor.Exit(Me)
Continue While
End If
End If
DefaultMessageTranslate()
End If
Threading.Monitor.Enter(Me)
Threading.Monitor.Wait(Me)
Threading.Monitor.Exit(Me)
End While
End Sub Private Sub DefaultMessageTranslate()
'以下可以定义默认的消息处理,可以封装成自己要用的
Select Case Msg.Message
Case 1 '我自己定义,1表示显示消息号或消息的解释
If Not Msg.param Is Nothing OrElse TypeOf Msg.param Is String Then
MessageBox.Show(DirectCast(Msg.param, String))
Else
Dim strMsg As String = String.Format("{0:d}", Msg.Message)
MessageBox.Show(strMsg)
End If
End Select
Msg.Message = 0 'Set message to unused
End Sub Public Sub New()
th = New Threading.Thread(AddressOf ThreadProc)
PerTranslateMessage = Nothing
End Sub Public Sub StartThread()
Try
th.Start()
Catch
Dim nLayer As Integer = GC.GetGeneration(th)
GC.Collect(nLayer)
th = New Threading.Thread(AddressOf ThreadProc)
th.Start()
End Try
End Sub
End Class
#End Region
//这是那个带有自定义消息循环的类,下面贴调用方法
Private myMsgQueue As CustomMessageQueue
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim msg As New CustomMessage
msg.Message = 1
msg.param = New String("我的自定义消息 ID:1")
CustomMessageQueue.PostMessage(myMsgQueue, msg)
End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim msg As New CustomMessage
msg.Message = 2
myMsgQueue.PostMessage(msg)
End Sub Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
myMsgQueue.PostQuitMessage()
End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myMsgQueue = New CustomMessageQueue()
myMsgQueue.StartThread()
myMsgQueue.PerTranslateMessage = New CustomMessageQueue.PerTranslateMessageHandler(AddressOf CustomMessageProc)
End Sub Private Function CustomMessageProc(ByRef m As CustomMessage) As Boolean
If m.Message = 1 Then
MessageBox.Show("我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵")
Return True
Else
MessageBox.Show(m.Message.ToString)
End If
Return False
End Function
End Class
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace CustomMessageQueue_CSharp
{
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
}