我的线程函数是视类的成员函数,定义为了static类型我是这样自定义消息的:
1、在视类的头文件中定义消息#define WM_MYMSG WM_USER+1000
2、在视类头文件 DECLARE_MESSAGE_MAP()中定义消息响应函数 afx_msg LONG OnReceiveEvent(WPARAM wParam,LPARAM lparam);
3、在视类的源文件里面添加消息映射:
BEGIN_MESSAGE_MAP(CPC2PCView, CEditView)  ON_MESSAGE(WM_MYMSG,OnReceiveEvent) 
END_MESSAGE_MAP()
这个样子定义消息可以吗?为什么我的消息貌似没有传递过来呢?

解决方案 »

  1.   

    把类指针this传递过去,在辅助线程中
    CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
    PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
      

  2.   

    你是怎么传的,用postmessage就可以了
      

  3.   

    我用的是
    ::PostMessage(hWnd,WM_MYMSG,0,(LPARAM)100);
    我是在线程函数里面发送消息的
      

  4.   

    请问这是什么意思?我的消息发送是::PostMessage(hWnd,WM_MYMSG,0,(LPARAM)100);
    这样不能直接传递给LPARAM吗?
      

  5.   

    可以的,直接发过去没关系的,问题是hWnd对不对,另外如果不行的话,用SendMessage试试
      

  6.   


    貌似不行啊!线程多是全局函数而且还必须是WINAPI。
      

  7.   

    在VC6里,定义为afx_msg void 就可以,而且最好放在DECLARE_MESSAGE_MAP宏外面,以区别于类向导添加的消息函数。
    同样地,在CPP文件里也最好放在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏对的外面。不过,你的写法如果编译不报错的话,应该没问题。
    你是怎么创建线程的?把那句写出来看看!
      

  8.   

    创建线程用:
    AfxBeginThread(ThreadProc, GetSafeHwnd());
    在线程函数里如下发送消息:
    ::PostMessage((HWND)pParam,WM_MYMSG,0,(LPARAM)100);
      

  9.   

    更正9楼说法:在源文件里应该是放在
    {{AFX_MSG_MAP(C×××)
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG_MAP
    外面,
    而在头文件里放在
    {{AFX_MSG(C×××)
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG
    外面
    sorry
      

  10.   

    我是在打开串口函数里面创建线程的:
    void CPC2PCView::OnOpencom()
    {
    //打开串口操作
    hCom=CreateFile(myCom,
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
    NULL);
    if(hCom!=INVALID_HANDLE_VALUE)
    {
    //成功打开串口,执行以下操作
    SetupComm(hCom,1500,1500);//设置发送缓冲时间1.5s,接收缓冲时间1.5s
    DCB myDCB;
    GetCommState(hCom,&myDCB);//获取当前串口参数
    myDCB.BaudRate=myBaudRate;
    myDCB.fBinary=TRUE;
    myDCB.fParity=myfParity;
    myDCB.ByteSize=8;
    myDCB.Parity=myParity;
    myDCB.StopBits=ONESTOPBIT;
    SetCommState(hCom,&myDCB);//设置串口通信参数
    blnOpened=true;
    //创建并立即执行线程函数
    DWORD dwParam;
    //设置允许的事件类型
    if((!SetCommMask(hCom,EV_RXCHAR))|EV_TXEMPTY)
    {
    AfxMessageBox("建立事件掩码失败!");
    }
    hThreadEvent=CreateThread(NULL,//创建事件线程
    0,
    //指定线程函数名称
    (LPTHREAD_START_ROUTINE)(ThreadProcEvent),
    &dwParam,
    0,//创建线程函数后,立即执行
    &dwThreadID);

                  if(hThreadEvent==INVALID_HANDLE_VALUE)
    {
    AfxMessageBox("事件线程创建失败!");
    }
    fEventRun=true;//允许事件函数执行循环体
    bytActStatus=10;//操作状态设为接收状态
    bytSendStatus=0;//发送状态设为0态
    bytRcvStatus=0;//接收状态设为0态
    bytResendCount=0;//重发次数清零
    uintStxCurNo=0;//当前发送数据序号清零 }
    else
    {
    AfxMessageBox("创建串口失败!");
    }}
      

  11.   

    hThreadEvent=CreateThread(NULL,//创建事件线程
    0,
    //指定线程函数名称
    (LPTHREAD_START_ROUTINE)(ThreadProcEvent),
    this,
    0,//创建线程函数后,立即执行
    &dwThreadID); 在线程中
    CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
    PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
      

  12.   

    你的dwParam参数是什么
    这个位置应该传入你要发消息的目标窗口
      

  13.   

    CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
    ASSERT(::IsWindow(pDlg->m_hWnd)); //这个看下有没有警告
    PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
      

  14.   

    CWnd* pDlg = (CWnd *) lParam; //lParam是传递过来的参数
    ASSERT(::IsWindow(pDlg->m_hWnd)); //这个看下有没有警告
    PostMessage(pDlg->m_hWnd, M_MYMSG, 0, 0);
    正解
      

  15.   

    谢谢,问题解决了 
    但是监听的结果为什么老是超时呢?是不是我的监听函数有问题?
    下面是我的监听函数
    DWORD CPC2PCView::ThreadProcEvent(LPVOID pParam)
    {DWORD dwEvtMask,dwRes; 
    bool fStopMsg;
    CWnd* pDlg = (CWnd *) pParam; 
    Eol.hEvent = CreateEvent(NULL,TRUE,         //设置Eol.hEvent成员为无信号状态 
    FALSE,NULL); 
    while(fEventRun) 

    WaitCommEvent(hCom,&dwEvtMask,               //监视串口事件 
              &Eol); 
          
    dwRes = WaitForSingleObject(Eol.hEvent,      //等待信号 
      1000); 
    switch(dwRes) 

    case WAIT_OBJECT_0:                          //成功得到事件监视结果 
    {
       switch(dwEvtMask) 
       { 
         case EV_RXCHAR:                              //接收到数据 
     {
      if(!fStopMsg) 
      { 
                fStopMsg = true; 
                ::PostMessage(pDlg->m_hWnd,WM_MYMSG,                  //向主线程发送消息,接收到数据 
                0,(LPARAM)1); 
      } 
          break; 
     }
         case EV_TXEMPTY: 
       {
       AfxMessageBox(_T("send buffer is empty")); 
           break;
       } 
       } 

    case WAIT_TIMEOUT:
    {
    ::PostMessage(pDlg->m_hWnd,WM_MYMSG,0,(LPARAM)100);
    }
    break; 

    return true; }
    }
    请各位再帮哈忙,多谢啦
      

  16.   

    dwRes = WaitForSingleObject(Eol.hEvent, //等待信号 
      1000);  
    换成无限等待试试,用GetLastError看是否有错误
    dwRes = WaitForSingleObject(Eol.hEvent, //等待信号 
      INFINITE);  
    PostMessage也可以换成SendMessage试试。