C++类成员函数创建线程问题
CString WinSocket::Reseve(CString MessR)
{
hThread = CreateThread(NULL, 0, InThread, (LPVOID)sClient, 0, &dwThreadId);
RevAndSend = MessR;
.............
}
DWORD WINAPI WinSocket::InThread(LPVOID lpParam)
{
SOCKET sock=(SOCKET)lpParam;// 取得接收套接字
int ret,
nLeft,
idx;
while(1){
ret = recv(sock, RevAndSend.GetBuffer(RevAndSend.GetLength()), 4096, 0);
WinSocket::RevAndSend.GetBuffer(RevAndSend.GetLength())[ret] = '\0 ';
nLeft = ret;// 剩余字节数
idx = 0;// 已发送字节数
}
RevAndSend.ReleaseBuffer();
closesocket(sock);
return 0;
}
这是错误提示:cannot convert parameter 3 from 'unsigned long (void *) ' to 'unsigned long (__stdcall *)(void *) '
帮忙看看谢谢各位高手了~
[解决办法]
InThread必须是静态成员函数
[解决办法]
将DWORD WINAPI WinSocket::InThread(LPVOID lpParam)声明为静态函数
然后利用传递过来的指针 调用成员函数.
[解决办法]
一个简单的例子
class test
{
int x;
public:
test(int y):x(y){};
void Do()
{
cout < <x < <endl;
}
static unsigned int __stdcall run(void* pv)
{
test* p = (test*)pv;
p-> Do();
return 0;
}
};
int main(int argc, char* argv[])
{
test t(100);
::_beginthreadex(0,0,test::run , &t , 0,0);
Sleep(1000);
return 0;
}
[解决办法]
InThread必须是静态成员函数
因为线程函数,在本质上需一个全局的概念,而在面向对象的编程中
静态成员能够的执行需求
[解决办法]
而且最好结合单实例模式