偶在对话框中创建了一个CProcessStrl控件,并用m_p1变量来进行控制。
然后,写了一个全局函数
UINT Add(LPVOID p)
{

    int i=p.GetPos();
    for(i;i<100;i++)
    {
        p.SetPos(i);
        Sleep(1000);
    }
    return 1;
}然后应按钮单击来触发事件
void CThreadDlg::OnStart() 
{
    CWinThread *m_thread=AfxBeginThread(Add,m_p1);
}不能通过编译,提示SetPos和GetPos函数的左边必须是类/结构/联合体。请问要如何传递这个参数???先不管程序的正确性如何,偶就想知道,我们传递不进去呢?要怎么样传递?

解决方案 »

  1.   

    原理:p只是一个void指针,指向可以指向任何内存,只是首地址,没法控制他的大小和内存结构
    所以你需要把p转化为CProcessStrl类的指针,然后调用其方法,才能进行类型和内存大小判定
      

  2.   

    UINT Add(LPVOID p)
    {
        CProcessStrl* p = (CProcessStrl*)p;
        int i=p->GetPos();
        for(i;i<100;i++)
        {
            p->SetPos(i);
            Sleep(1000);
        }
        return 1;
    }
    void CThreadDlg::OnStart() 
    {
        CWinThread *m_thread=AfxBeginThread(Add,(LPVOID)&m_p1);
    }
      

  3.   

    UINT Add(LPVOID param)
    {
        CProcessStrl* p = (CProcessStrl*)param;
        int i=p->GetPos();
        for(i;i<100;i++)
        {
            p->SetPos(i);
            Sleep(1000);
        }
        return 1;
    }
    void CThreadDlg::OnStart() 
    {
        CWinThread *m_thread=AfxBeginThread(Add,(LPVOID)&m_p1);
    }
      

  4.   

    错误有二:
    1,参数使用问题,缺少类型转换
    2,控件的方法调用问题,在子线程里不可直接访问,通过中间方法
    修改如下:
    添加方法:
    void CThreadDlg::SetPressPos(int intPos)
    {
        m_p1.SetPos(intPos);
    }void CThreadDlg::GetPressPos(int &intPos)
    {
        intPos = m_p1.GetPos();
    }UINT Add(LPVOID p)
    {
        CProcessStrl* pPrc =(CProcessStrl* )p;
        int intPos;
        pPrc.GetPressPos(intPos);    for(i;i<100;i++)
        {
            pPrc.SetPos(intPos);
            Sleep(1000);
        }
        return 1;
    }