SENDMESSAGE函数不是立即返回的,那如果有多个线程同时向一个窗体发消息(用SENDMESSAGE),会不会造成这些线程的阻死?

解决方案 »

  1.   

    SendMessage基本上就可以理解为调用目标窗口类的方法。
      

  2.   

    SendMessage会造成堵塞。因为每个线程都在等待答复。但响应只能逐个处理,不能并发
      

  3.   

    那我的函数是这样的threadfunc(...)
    {
      cstring m_strInfo;
      
      ....
      ...
      
      m_strinfo = "test info";
      ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo);
      
      return 1;
    }些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.
      

  4.   

    线程中发消息一般用 PostMessage
      

  5.   

    那我的函数是这样的threadfunc(...)
    {
      cstring m_strInfo;
      
      ....
      ...
      
      m_strinfo = "test info";
      ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo);
      
      return 1;
    }些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.
      

  6.   

    不知道你的应用
    如果你的线程只是为了发某个消息的话,大可不必用PostMessage
    如果是这样的话,你可以通过线程的函数的参数来传你要的地址(消息的参数LPARAM的值s)
      

  7.   

    举个例子,我的线程专门SOCKET接收信息,当SOCKET断开后或接收错误后,要向主界面(对话框)的列表框中写相应的信息
      

  8.   

    在threadfunc(...)之外提供存储空间,通过参数传递
      

  9.   

    goodsmaker,你的意思是不是指使用全局量
      

  10.   

    to lixiaosan:用POSTMESSAGE的话,线程一旦退出后,我的存消息内容的地址不就无效了吗,MESSAGE的处理函数就报错了,这怎么处理啊
      

  11.   

    全局的可以,不是全局的也可以.你上面说的:
    些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.是因为那个hwnd是ListCtrl,如果是Edit或Static就不会有这个问题,你试试看.如果是,就有解决办法.
      

  12.   

    对不起,没看仔细,我的意思是如果是edit或static的话,你可以在线程中直接操作控件,不必发消息
      

  13.   

    有几点我说明一下:
    1.我的m_hWnd是对话框的名柄
    2.我的对话框消息处理函数是
      onxxxxx(wparam wparam lparam lparam)
      {
         CString m_Info;
         
         m_strInfo = *(CString *)lparam; <-  问题是这
         
         lstXXX.insertitem(....);
         ....
      }如果在线程中的那个地址无效了,则上面那句就会出问题
    我想的是,比如我有10个线程,每个线程退出时都会POST一个消息给对话框,而对话框的处理函数可以
    正确的得到这些信息并显示在LIST中
      

  14.   

    threadfunc(...)
    {
      cstring m_strInfo;
      
      ....
      ...  CString *pstrinfo = new CString();
      *pstrinfo = "test info";
      ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)pstrinfo);
      
      return 1;
    }
    onxxxxx(wparam wparam lparam lparam)
      {
         CString *pInfo = (CString *)lparam;
         
         lstXXX.insertitem(....);
         ....
         delete pInfo;
      }
      

  15.   

    代码没有测试,仅供参考!
    threadfunc(...)
    {
      cstring m_strInfo;
      
      ....
      ...
      
      m_strinfo = "test info";
      char *pNewStr = new char[m_strInfo.GetLength()+1];
      //new 出来的内存只有调用delete时才会释放
      strcpy(pNewStr, m_strinfo.GetBuffer(0));
      ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&pNewStr);
      
      return 1;
    }
    接收消息:
    char *p = (char*)lParam;
    TRACE("Message: %s", p);
    delete []p;