程序启动三个线程,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线程

解决方案 »

  1.   

    问题在于你错误使用了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是一个模式窗口,本质上也要有个消息循环。
    这个额外的消息循环,接管了你的自定义消息,却没有办法再次派发(没有窗口句柄),于是该消息被吃掉。
      

  2.   

    太感谢了!!那么在里面就不能用meessagebox提示信息吗?或者说里面不能再有其他类似消息循环吗?