//定义
class ESKT  
{
public:
static void SAcceptThread(LPVOID pParam);
static void CAcceptThread(LPVOID pParam);
void Stop(ServerType l_type);
CString ShowErrorInfo();
bool LS(ServerType l_type,int l_lsnum);
ESKT();
virtual ~ESKT();
protected:
int ServerNum;
DWORD LastErrNo;
SOCKET l_pskt;
SOCKET l_cskt;
struct sockaddr_in l_sa;
};void ESKT::CAcceptThread(LPVOID pParam)
{}bool ESKT::LS(ServerType l_type,int l_lsnum)
{
//....
AfxBeginThread(CAcceptThread,(LPARAM)&l_cskt);//这是调用
}/*出错
E:\工作区\代理与打洞应用开发\EWProxyServer\ESKT.cpp(54) : error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'void (void *)'
????请问为什么
*/

解决方案 »

  1.   

    AfxBeginThread,调用函数可以是全局函数静态成员函数
    参数和返回值都有限制
    一般成员函数有隐藏的参数this
      

  2.   

    static DWORD WINAPI CAcceptThread(LPVOID lpParam );
      

  3.   

    static DWORD WINAPI CAcceptThread(LPVOID lpParam );
    你这样定义应该是全局的吧.但如果我要把这个类独立出来,里面具要有线程处理该如何做呢?
    类里能不能实现线程的功能.
      

  4.   

    class CAsThread : public CWinThread
    {
    DECLARE_DYNCREATE(CAsThread)public:
    CAsThread();           // protected constructor used by dynamic creation
    virtual ~CAsThread();public:
    virtual BOOL InitWorkerThread();
    virtual int ExitWorkerThread(); virtual BOOL Start(int nPriority = THREAD_PRIORITY_NORMAL);
    virtual BOOL Stop(DWORD dwTimeOut = 1000);
    virtual BOOL StopAsync();protected:
    BOOL m_bWorkerInitialized;
    HANDLE m_hStopEvent;
    static UINT ThreadFunc(LPVOID lpParam);    // 注意这里的线程函数
    virtual UINT Go() { return 0;}             // 注意这个函数protected:
    DECLARE_MESSAGE_MAP()
    };//线程函数的实现
    UINT CAsThread::ThreadFunc(LPVOID lpParam)
    {
    UINT ret = 1; // invalid thread parameter
    CAsThread * pAsThread = 0;
    pAsThread = (CAsThread *)lpParam;            // 参数为线程类对象指针,知道怎么作了吧

    if(pAsThread)
    {
    ret = pAsThread->Go();
    } return ret;
    }
      

  5.   

    virtual BOOL InitWorkerThread();
    virtual int ExitWorkerThread(); virtual BOOL Start(int nPriority = THREAD_PRIORITY_NORMAL);
    virtual BOOL Stop(DWORD dwTimeOut = 1000);
    virtual BOOL StopAsync();
    这是重载CWINTHREAD吗,可以不要吗?
      

  6.   

    这是我自己的函数,不是MFC的,可以不要。
    你只要把
    static UINT ThreadFunc(LPVOID lpParam);    // 注意这里的线程函数
    virtual UINT Go() { return 0;} 
    加到你的类里就可以了
      

  7.   

    静态成员函数
    static DWORD WINAPI SAcceptThread(LPVOID pParam);
    static DWORD WINAPI CAcceptThread(LPVOID pParam);
    当然也可以用全局函数
      

  8.   

    static DWORD WINAPI CAcceptThread(LPVOID pParam);这样申明又是如何调用的呢?