目的:
线程回调函数使用类成员函数的目的是可以直接访问类属性,保持封装性
方法:
利用this指针传递实例的地址,然后调用实例的成员函数,在成员函数中就可以访问类属性
简单示例:
定义一个参数类,其中m_pObj是指向类实例
class ThreadArg {
public:
ThreadArg(RfidTcpServer *pObj, int socket)
:m_pObj(pObj), m_socket(socket)
{
}
public:
RfidTcpServer *m_pObj;
int m_socket;
};
在类中定义static成员函数作为中转
class RfidTcpServer {
public:
RfidTcpServer(IEpcHandler *pHandler);
virtual ~RfidTcpServer();
public:
void IsAccept();
static DWORD WINAPI ParserPacketRoutine(LPVOID pM);
int ParserPacket(int conn);
private:
SOCKET listenSocket;
SOCKET connectSocket;
SOCKADDR_IN servAddr;
SOCKADDR_IN clntAddr;
int serverPort;
IEpcHandler *m_pHandler;
};
DWORD WINAPI RfidTcpServer::ParserPacketRoutine(LPVOID pM)
{
ThreadArg *pArg = (ThreadArg *)pM;
pArg->m_pObj->ParserPacket(pArg->m_socket);
return 0;
}
创建线程,将类中的static函数作为线程回调函数
void RfidTcpServer::IsAccept()
{
int clntAddrLen = sizeof(SOCKADDR_IN);
while(1) {
connectSocket = accept(listenSocket, (sockaddr *)&clntAddr, &clntAddrLen);
if (connectSocket < 0)
{
return;
}
else {
ThreadArg *pArg = new ThreadArg(this, connectSocket);
//将this指针和参数打包为ThreadArg,作为线程函数的参数
CreateThread(NULL, 0, ParserPacketRoutine, (LPVOID)pArg, 0, NULL);
}
}
}