您的位置:首页 > 编程语言 > C语言/C++

C++线程回调函数调用类成员函数方法

2014-08-05 21:20 148 查看

目的:

线程回调函数使用类成员函数的目的是可以直接访问类属性,保持封装性

方法:

利用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
4000
, (sockaddr *)&clntAddr, &clntAddrLen);
if (connectSocket < 0)
{
return;
}
else {
ThreadArg *pArg = new ThreadArg(this, connectSocket);
//将this指针和参数打包为ThreadArg,作为线程函数的参数
CreateThread(NULL, 0, ParserPacketRoutine, (LPVOID)pArg, 0, NULL);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 线程