首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++类成员函数创建线程有关问题

2012-02-07 
C++类成员函数创建线程问题CStringWinSocket::Reseve(CStringMessR){hThreadCreateThread(NULL,0,InThrea

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必须是静态成员函数
因为线程函数,在本质上需一个全局的概念,而在面向对象的编程中
静态成员能够的执行需求
[解决办法]
而且最好结合单实例模式

热点排行