我写了一个可以在另一个线程中做一些工作的类:
class SkeData
{
public:
SkeData(INuiSensor* pSensor);
~SkeData();
HANDLE StartSaveSkeData_Frames(int nFrames = 1);
HANDLE StartSaveSkeData2File_Frames(HANDLE hFile,int nFrames = 1);
[...]
private:
//Two thread functions
static DWORD WINAPI AddFrames(LPVOID lpParam);
static DWORD WINAPI AddFrames2File(LPVOID lpParam);
[...]
};
HANDLE SkeData::StartSaveSkeData_Frames(int nFrames)
{
[...]
m_hThread = CreateThread(NULL, 0, AddFrames, this, 0, NULL);
return m_hThread;
}
HANDLE SkeData::StartSaveSkeData2File_Frames(HANDLE hFile,int nFrames)
{
[...]
m_hThread = CreateThread(NULL, 0, AddFrames2File, this, 0, NULL);
return m_hThread;
}
DWORD WINAPI SkeData::AddFrames(LPVOID lpParam)
{
SkeData *This = (SkeData *)lpParam;
return This->Thread_AddFrames();
}
DWORD WINAPI SkeData::AddFrames2File(LPVOID lpParam)
{
SkeData *This = (SkeData *)lpParam;
return This->Thread_AddFrames2File();
}
When I built the program solution in VS2010, linking error came up like this:
SkeData.obj : error LNK2019: unresolved external symbol "private: unsigned long __thiscall SkeData::Thread_AddFrames2File(void)" (?Thread_AddFrames2File@SkeData@@AAEKXZ) referenced in function "private: static unsigned long __stdcall SkeData::AddFrames2File(void *)" (?AddFrames2File@SkeData@@CGKPAX@Z)
1>E:\***\DataCollection.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
但是,当我删除其中一个线程函数时,它可以成功构建。因此,我猜错误的原因是关于线程函数。但我仍然不明白为什么我不能在我的班级中添加一个线程函数???
我希望任何人都可以提供更多解释。
谢谢!
更多:抱歉,当我粘贴我的代码时出现了问题。我确实实现了两个线程函数......如果我没有,那么错误将不会是这样的,对吧?
答案 0 :(得分:2)
根据链接错误判断,您可能从未定义过函数AddFrames2File
。由于您正在使用该函数,链接器(基本上是负责将所有代码放在一起的编译器的一部分)会抱怨它无法找到此函数的定义。
函数声明声明它是原型。也就是说,它是返回类型,名称和参数,就像您在类声明中所做的那样。
static DWORD WINAPI AddFrames2File(LPVOID lpParam); //lpParam can be ommited
从现在开始,您可以使用此函数,因为您的编译器知道应该如何调用它。 (注意lpParam
可以省略,编译器不需要知道如何调用该函数。但是,您仍然需要在某处定义您的函数以实际将代码与功能。像这样:
static DWORD WINAPI SkeData::AddFrames2File(LPVOID lpParam)
{
//Actual code here
std::cout << "This function is now defined!" << std::endl;
}
请注意,我正在使用SkeData::
告诉编译器我正在定义哪个函数。如果我没有这样做,函数定义将被视为在全局命名空间(或您当前正在使用的任何命名空间)中定义新函数。