首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

急请问下PostThreadMessage消息丢失有关问题!

2013-09-28 
急请教下PostThreadMessage消息丢失问题!!程序启动三个线程,A,B,C,A和B分别发送消息(用posthreadmessage)

急请教下PostThreadMessage消息丢失问题!!
程序启动三个线程,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 线程
[解决办法]
问题在于你错误使用了MessageBox.Show来做测试。
改成类似以下代码(记得不要弹出窗口):


case WM_CX1:
  File.AppendAllText(@"c:\temp\log.txt", "1消息收到!");
  break;
case WM_CX2:
  File.AppendAllText(@"c:\temp\log.txt", "2消息收到!");
  break;


原因是,MessageBox是一个模式窗口,本质上也要有个消息循环
这个额外的消息循环,接管了你的自定义消息,却没有办法再次派发(没有窗口句柄),于是该消息被吃掉。

热点排行