程序启动三个线程,A,B,C,A和B分别发送消息(用posthreadmessage)给C,在C 中getmessage时候发现总是没法两个消息都收到,要么收到A的,要么收到B的,
代码:
private int SQLThreadId = 0;
private Thread SQL_Thread;
int s1,s2;
public struct tagMSG
{
public int hwnd;
public uint message;
public int wParam;
public long lParam;
public uint time;
public int pt;
}
public tagMSG msg1;
private Thread SQL_Thread2;
private Thread SQL_Thread3;
public void SQL1_ThreadExectue()
{
while (SQLThreadId==0)
Thread.Sleep(50);
s1=PostThreadMessage(SQLThreadId, WM_CX1, 1, 1); }
public void SQL2_ThreadExectue()
{
while (SQLThreadId==0)
Thread.Sleep(50);
s1=PostThreadMessage(SQLThreadId, WM_CX2, 1, 1); }
{
public void SQL_Thread3Exectue()
{
SQLThreadId = GetCurrentThreadId();
int dwRtn;
while ((dwRtn = GetMessage(ref msg1, 0, 0, 0)) != 0)
{
if (dwRtn == -1)
{ }
else
{
switch (msg1.message)
{
case WM_CX1:
MessageBox.Show("1消息收到!");
break;
case WM_CX2:
MessageBox.Show("2消息收到!");
break;
default: break;
}
}
} private void Form1_Load(object sender, EventArgs e)
{ msg1 = new tagMSG();
SQL_Thread = new Thread(new ThreadStart(this.SQL_ThreadExectue));
SQL_Thread.Start();
SQL_Thread2 = new Thread(new ThreadStart(this.SQL_Thread2Exectue));
SQL_Thread2.Start();
SQL_Thread3 = new Thread(new ThreadStart(this.SQL_Thread3Exectue));
SQL_Thread3.Start(); }PostThreadMessage线程
代码:
private int SQLThreadId = 0;
private Thread SQL_Thread;
int s1,s2;
public struct tagMSG
{
public int hwnd;
public uint message;
public int wParam;
public long lParam;
public uint time;
public int pt;
}
public tagMSG msg1;
private Thread SQL_Thread2;
private Thread SQL_Thread3;
public void SQL1_ThreadExectue()
{
while (SQLThreadId==0)
Thread.Sleep(50);
s1=PostThreadMessage(SQLThreadId, WM_CX1, 1, 1); }
public void SQL2_ThreadExectue()
{
while (SQLThreadId==0)
Thread.Sleep(50);
s1=PostThreadMessage(SQLThreadId, WM_CX2, 1, 1); }
{
public void SQL_Thread3Exectue()
{
SQLThreadId = GetCurrentThreadId();
int dwRtn;
while ((dwRtn = GetMessage(ref msg1, 0, 0, 0)) != 0)
{
if (dwRtn == -1)
{ }
else
{
switch (msg1.message)
{
case WM_CX1:
MessageBox.Show("1消息收到!");
break;
case WM_CX2:
MessageBox.Show("2消息收到!");
break;
default: break;
}
}
} private void Form1_Load(object sender, EventArgs e)
{ msg1 = new tagMSG();
SQL_Thread = new Thread(new ThreadStart(this.SQL_ThreadExectue));
SQL_Thread.Start();
SQL_Thread2 = new Thread(new ThreadStart(this.SQL_Thread2Exectue));
SQL_Thread2.Start();
SQL_Thread3 = new Thread(new ThreadStart(this.SQL_Thread3Exectue));
SQL_Thread3.Start(); }PostThreadMessage线程
改成类似以下代码(记得不要弹出窗口):case WM_CX1:
File.AppendAllText(@"c:\temp\log.txt", "1消息收到!");
break;
case WM_CX2:
File.AppendAllText(@"c:\temp\log.txt", "2消息收到!");
break;
原因是,MessageBox是一个模式窗口,本质上也要有个消息循环。
这个额外的消息循环,接管了你的自定义消息,却没有办法再次派发(没有窗口句柄),于是该消息被吃掉。