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没有这个关键字,怎么办
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没有这个关键字,怎么办
enjoy
{
union
{
ThreadProc3 f1;
DWORD (WINAPI ZThread::*f2)(LPVOID lpParameter);
}f;
f.f2 = ThreadProc2;
m_ThreadProc = f.f1;
}
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!");
}
}
我自己的一个封装。
这个函数不可能转成
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;
}
这个方法跟强制转换的效果好像是一样的。
实际上说方法唯一太绝对了吧,函数指针调用的函数为全局函数或静态函数,楼主上面的只需要把函数定义为静态的就解决了