我在A.h中声明了一个线程函数,在A.cpp中实现此线程函数
A.h
unsigned _stdcall dataSendThread(void* param); //线程函数
然后在CClient.h中有一个类CClient
class CClient
{
public:
void startRunning();
friend unsigned _stdcall dataSendThread(void* param); //将线程函数声明为类CClient的友元
};
CClient.cpp中
void CClient::startRunning()
{
_beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}
在编译时报如下的错误:
error LNK2019: 无法解析的外部符号 "unsigned int __stdcall dataRecvThread(void *)" (?dataRecvThread@@YGIPAX@Z),该符号在函数 "public: bool __thiscall CClient::startRunning(void)" (?startRunning@CClient@@QAE_NXZ) 中被引用
10 个解决方案
#1
怎么是dataRecvThread?..........
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。
#2
定义呢。。。定义呢
#3
用static成员函数多好啊?
#4
好像是得用static成员
#5
可以把线程函数,写成类的静态函数:
class CClient
{
public:
static unsigned _stdcall dataSendThread(void* param); //线程函数
void ThreadFunc();// 真正的线程函数,想访问成员,就访问哪个成员
public:
startRunning();
};
void CClient::startRunning()
{
_beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}
unsigned _stdcall CClient::dataSendThread(void* param)
{
static_cast<CClient*>(param)->ThreadFunc();
}
#6
线程函数应该是静态的,否则创建线城时找不到入口地址
#7
线程函数可以传入一个参数,你可以将你的类对象指针传进去。在函数里面再将它转换成实际对象的类型
#8
同意5楼的做法
建议去看看 侯捷翻译的《win32多线程程序设计》一书
建议去看看 侯捷翻译的《win32多线程程序设计》一书
#9
我用原来的那种方法,将线程函数声明为CClient的友元函数也能完成功能,不过还是谢谢各位了,还有就是5楼的方法,线程函数中能改变类中的非static成员的值吗
#10
线程函数需要写成全局的 需要加上static
#1
怎么是dataRecvThread?..........
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。
#2
定义呢。。。定义呢
#3
用static成员函数多好啊?
#4
好像是得用static成员
#5
可以把线程函数,写成类的静态函数:
class CClient
{
public:
static unsigned _stdcall dataSendThread(void* param); //线程函数
void ThreadFunc();// 真正的线程函数,想访问成员,就访问哪个成员
public:
startRunning();
};
void CClient::startRunning()
{
_beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}
unsigned _stdcall CClient::dataSendThread(void* param)
{
static_cast<CClient*>(param)->ThreadFunc();
}
#6
线程函数应该是静态的,否则创建线城时找不到入口地址
#7
线程函数可以传入一个参数,你可以将你的类对象指针传进去。在函数里面再将它转换成实际对象的类型
#8
同意5楼的做法
建议去看看 侯捷翻译的《win32多线程程序设计》一书
建议去看看 侯捷翻译的《win32多线程程序设计》一书
#9
我用原来的那种方法,将线程函数声明为CClient的友元函数也能完成功能,不过还是谢谢各位了,还有就是5楼的方法,线程函数中能改变类中的非static成员的值吗
#10
线程函数需要写成全局的 需要加上static