编程平台是VS2010
LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
{
int nTmpt = 0;
for(int i=0 ;i <=(int)wParam;i++)
{
nTmpt = nTmpt+i;
}
Sleep(500);
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
return 0;
}// CCalculateThread 消息处理程序BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
//AFX_MSG_MAP(CCalculateThread)
//ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
END_MESSAGE_MAP()出错:
1>ClCompile:
1>  所有输出均为最新。
1>  CalculateThread.cpp
1>c:\users\venuslee\documents\visual studio 2010\projects\multithread7\multithread7\calculatethread.cpp(51): error C2440: “static_cast”: 无法从“LONG (__thiscall CCalculateThread::* )(UINT,LONG)”转换为“void (__thiscall CWinThread::* )(WPARAM,LPARAM)”
1>          在匹配目标类型的范围内没有具有该名称的函数
1>
1>生成失败。
1>
1>已用时间 00:00:00.72

解决方案 »

  1.   

    afx_msg LRESULT OnFun(WPARAM wp, LPARAM lp);
    BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
    //{{AFX_MSG_MAP(CMyThread)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
    ON_THREAD_MESSAGE(WM_MYMESSAGE, OnFun)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CMyThread message handlersLRESULT CMyThread::OnFun(WPARAM wp, LPARAM lp)
    {
    return 0;
    }
      

  2.   


    ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)他说类型转换无效
      

  3.   

    ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
      

  4.   

    CCalculateThread 是否继承CWinThread
      

  5.   

    无法从“LONG (__thiscall CCalculateThread::* )(UINT,LONG)”转换为“void (__thiscall CWinThread::* )(WPARAM,LPARAM)”你把你的函数从返回LONG,改为void,即不返回,不就行了?
    当然,UINT,LONG 参数也得改为 WPARAM,LPARAM
      

  6.   

    LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
    改为
    void CCalculateThread::OnCalculate(UINT wParam,LONG lParam) LONG CCalculateThread::OnCalculate(UINT wParam, LONG lParam)
    {
    int nTempt=0;
    for(int i=0;i<(int)wParam;i++)
    {
    nTempt = nTempt+ i;
    }
    Sleep(500);
    ::PostMessageW((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTempt,NULL);
    return 0;//返回类型void,这里改为return;
    }
      

  7.   

    ON_THREAD_MESSAGE  改为 ON_MESSAGE_VOID
      

  8.   

    ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
    的确要改为  ON_THREAD_MESSAGE同时将消息函数返回值改为 void 型式我这样通过了  VS2010  Win7 64Bit
    楼主搞定了都不说 严重鄙视! 
      

  9.   

    ON_THREAD_MESSAGE(WM_CALCULATE,&CCalculateThread::OnCalculate)
    的确要改为  ON_THREAD_MESSAGE同时将消息函数返回值改为 void 型式我这样通过了  VS2010  Win7 64Bit
    楼主搞定了都不说 严重鄙视! 

    C++微软的孽种
    本人使用java从来未遇到如此多的问题
    关于此问题ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
    我给出以下解决方法
    1.定义消息: 
    在"C实验ON_MESSAGEDlg"类的头文件中加入如下代码: 
    #define WM_CUSTOMIZE WM_USER+100 
    头文件中加入Customize的声明: 
    afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam); 2.cpp文件中加入消息的注册 
    ON_MESSAGE(WM_CUSTOMIZE, Customize) 3.加入消息响应函数实现 
    LRESULT C实验ON_MESSAGEDlg::Customize(WPARAM wParam, LPARAM lParam)
    {
      CString strTittle;
      strTittle.Format("自定义消息参数:x=%d,y=%d",wParam,lParam);
      //SetWindowText(strTittle);
      setMessage(strTittle);
      return 1;
    }
    void C实验ON_MESSAGEDlg::setMessage(LPCTSTR newInfo)
    {
       CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);
       pEdit->SetWindowTextA(newInfo);
    }
     
    4.显式地发送消息: 
    在主框架的“帮助”主菜单中加入“自定义消息”子菜单,其ID设为ID_CUSTOMIZE,通过类向导响应该命令,函数名默认。其函数体如下: 
    void C实验ON_MESSAGEDlg::OnCustomize()
    {
        // TODO: 在此添加命令处理程序代码
        HWND pdlg;
        POINT pos;
      //将消息参数定义为屏幕坐标值
        GetCursorPos(&pos);
        pdlg=this->GetSafeHwnd();
        /::SendMessage(pdlg,WM_CUSTOMIZE,(UINT)pos.x,pos.y);
        ::PostMessage(pdlg, WM_CUSTOMIZE, (UINT)pos.x, pos.y);
    }
    //农机调度项目中代码:
    void CWebServer::PostMsgToOwner(SERVER_INFO serverInfo)
    {
        //向所属窗体发送通知消息
        if ( ::IsWindow(m_ownerHWND)  )
        {
            LPARAM lParam = 0;
            WPARAM wParam = 0;
     
            if (serverInfo == SERVER_STARTED)
            {
                //用户只能配置客户端数、不需要知道临时并发数
                lParam = MAKEWPARAM(m_cocurrentConstantClientNumber, m_serverConstantConnectPort);
                wParam = MAKEWPARAM(0, serverInfo);
            }
            else
            {
                wParam = MAKEWPARAM(0, serverInfo);
            }
            ::PostMessage(m_ownerHWND, WM_USER_SERVERINFO, wParam, lParam);
        }
    }
     
    ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏 
      

  10.   

    返回类型改为LRESULT后编译就通过了楼主搞定了都不说 严重鄙视!