typedef DWORD (WINAPI *ThreadProc3)(LPVOID lpParameter);这是线程函数比如我写一个类ZThread
class ZThread
{
public: ZThread();
virtual ~ZThread(); DWORD WINAPI ThreadProc2(LPVOID lpParameter);private:
ThreadProc3 m_ThreadProc;
}现在我要让在构造函数中m_ThreadProc = ThreadProc2;就不行,报错。
我以前用C++buider中只要申明为
typedef DWORD (__closure WINAPI *ThreadProc3)(LPVOID lpParameter);就可以了,
但VC没有这个关键字,怎么办

解决方案 »

  1.   

    static DWORD WINAPI ThreadProc2(LPVOID lpParameter);
      

  2.   

    please like following;m_ThreadProc = (ThreadProc3*)ThreadProc2;you can try
    enjoy
      

  3.   

    ZThread::ZThread()
    {
        union
        {
            ThreadProc3 f1;
            DWORD (WINAPI ZThread::*f2)(LPVOID lpParameter);
        }f;
        f.f2 = ThreadProc2;
        m_ThreadProc = f.f1;
    }
      

  4.   

    你要封装线程函数吧。
    class CThread : public noncopyable
    {
    public :
    CThread();
    virtual ~CThread();
    HANDLE GetHandle() const;
    void Wait() const;
    bool Wait(DWORD timeoutMillis) const;
    void Start();
    void Terminate(DWORD exitCode = 0);
    void Resume();
    void Suspend();
    void SetThreadIdNull(){m_hThread = INVALID_HANDLE_VALUE;}
    private :
    virtual int Run() = 0;
    static unsigned int __stdcall ThreadFunction(void *pV);
    HANDLE m_hThread;
    };void CThread::Start()
    {
    if (m_hThread == INVALID_HANDLE_VALUE)
    {
    unsigned int threadID = 0; m_hThread = (HANDLE)::_beginthreadex(0, 0, ThreadFunction, (void*)this, 0, &threadID); if (m_hThread == INVALID_HANDLE_VALUE)
    {
    g_Log.log(__FUNCTION__,"Error: %u",::GetLastError());
    }
    }
    else
    {
    g_Log.log(__FUNCTION__,"Thread already running - you can only call Start() once!");
    }
    }
    我自己的一个封装。
      

  5.   

    DWORD WINAPI ThreadProc2(ZThread *this,LPVOID lpParameter);
    这个函数不可能转成
    typedef DWORD (WINAPI *ThreadProc3)(LPVOID lpParameter);所以m_ThreadProc = (ThreadProc3*)ThreadProc2;这样转是不会成功的。
    ZThread::ZThread()
    {
        union
        {
            ThreadProc3 f1;
            DWORD (WINAPI ZThread::*f2)(LPVOID lpParameter);
        }f;
        f.f2 = ThreadProc2;
        m_ThreadProc = f.f1;
    }
    这个方法跟强制转换的效果好像是一样的。
      

  6.   

    m_ThreadProc = (ThreadProc3)&ThreadProc2;前面多了个*,不然也可以的。
      

  7.   

    to:ross33123() ( ) 
    实际上说方法唯一太绝对了吧,函数指针调用的函数为全局函数或静态函数,楼主上面的只需要把函数定义为静态的就解决了