俺最近在用VC做项目,其中用到串口操作,调用API函数,要创建一个辅助线程监视串口,对从串口接受到的数据进行操作。(程序是基于对话框的)。当中创建辅助线程时候出现错误。下面我给出部分程序代码,请大家给我建议和指出错误,谢谢大家啦!
UINT CTestDlg::CommThreadProc(LPVOID pParam)//线程函数名
{
 //具体的代码实现部分我就不写了,太多了
}
BOOL CTestDlg::StartMonitoring( )//按钮响应事件
{
m_Thread=AfxBeginThread(CommThreadProc,NULL,THREAD_PRIORITY_ABOVE_NORMAL,0,0,NULL);
}
最后编译出现错误: error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)' 小弟我已经调试了多次了,我尝试着把AfxBeginThread函数的第二个参数换成GetSafeHwnd(),各位帮帮忙,我调试了一天不知道错在哪里了????

解决方案 »

  1.   

    UINT CTestDlg::CommThreadProc(LPVOID pParam)//线程函数名
    {
     //具体的代码实现部分我就不写了,太多了
    }
    在头文件中定义为static函数或不要定义为成员函数(UINT CommThreadProc(LPVOID pParam))
      

  2.   

    UINT CommThreadProc(LPVOID pParam)//线程函数名
    {
       CTestDlg *pTestDlg = (CTestDlg *)pParam;
       pTestDlg->InitComPort();
       pTestDlg->dosomething();
       return 0;
    }
    BOOL CTestDlg::StartMonitoring( )//按钮响应事件
    {
    m_Thread=AfxBeginThread(CommThreadProc,this,THREAD_PRIORITY_ABOVE_NORMAL,0,0,NULL); // 加上this;
    }或者像楼上所说,把CommThreadProc申明为static;
      

  3.   

    我在头文件中把CommThreadProc定义成static函数了,可又出现了别的问题,我调用的一个类的对象(自己写的串口类)在CommThreadProc不能识别啊。各位兄弟,这是咋回事???
      

  4.   

    Atomictry(天影):你好,你这种方法我开始也试过了,不行的。出现同样的错误。
      

  5.   

    CommThreadProc函数不能直接使用成员函数和成员变量
      

  6.   

    如果不对线程做太多控制,就直接用m_Thread=AfxBeginThread(CommThreadProc,NULL),给它两个参数就行,一个是处理函数,一个是参数
    线程处理函数可以是三种形式:全局的、静态成员函数、普通成员函数。前两种不用说,普通成员函数也是可以的,只是在作为mAfxBeginThread的参数时,要使用一个宏,宏的名字记不清了,可以去查MSDN
      

  7.   

    俺做了个简单工程,(工程名为CSecondaryThread,基于对话框)进行验证,部分代码如下:
    在头文件SecondaryThreadDlg.h 声明线程处理函数 UINT WorkerThreadProc( LPVOID Param );
    在SecondaryThreadDlg.cpp添加如下代码:
    UINT CSecondaryThreadDlg::WorkerThreadProc( LPVOID Param )
    {
       CFile file;
       file.Open("C:\\Temp\\test.txt",CFile::modeCreate|CFile::modeWrite);
       CString strValue;
       for(int i=0;i<=100;i++)
       {
          strValue.Format("Value:%d",i);
          file.Write(strValue,strValue.GetLength()); // Write to the file for worker thread using AfxBeginThread
       }
       file.Close();
       return TRUE;
    }
    在按钮事件添加如下代码:
    void CSecondaryThreadDlg::OnOK() 
    {
       AfxBeginThread(WorkerThreadProc,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
       MessageBox("Thread Started");
    }
    编译时还是出现LZ同样的错误:error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)' 也额肯请各位之处错误在哪里?????
      

  8.   

    楼主,你没有仔细看上面的回复啊class CSecondaryThreadDlg
    {
    static UINT WorkerThreadProc( LPVOID Param );
    };
    UINT CSecondaryThreadDlg::WorkerThreadProc( LPVOID Param )
    {
    // 若要用对话框指针,这么还原!!!!
    CSecondaryThreadDlg* pDlg = (CSecondaryThreadDlg*)Param;  CFile file;
       file.Open("C:\\Temp\\test.txt",CFile::modeCreate|CFile::modeWrite);
       CString strValue;
       for(int i=0;i<=100;i++)
       {
          strValue.Format("Value:%d",i);
          file.Write(strValue,strValue.GetLength()); // Write to the file for worker thread using AfxBeginThread
       }
       file.Close();
       return TRUE;
    }
    void CSecondaryThreadDlg::OnOK() 
    {
       AfxBeginThread(WorkerThreadProc,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
       MessageBox("Thread Started");
    }