2013-03-17 91 views
-3

我写了一个类,可以做一些工作,在另一个线程:一个类可以有多个线程函数吗?

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)" ([email protected]@@AAEKXZ) referenced in function "private: static unsigned long __stdcall SkeData::AddFrames2File(void *)" ([email protected]@@[email protected]) 
1>E:\***\DataCollection.exe : fatal error LNK1120: 1 unresolved externals 
1> 
1>Build FAILED. 

然而,当我删除的线程功能之一,它可以成功地建造。因此我猜想错误的原因是关于线程函数的。但我仍然不明白为什么我无法在我的课程中添加更多的线程函数?

我希望任何人都能给出更多的解释。

谢谢!

更多:抱歉,当我粘贴我的代码时出现了错误...我确实实现了两个线程函数......如果我没有,错误不会是这样的,对吧?

+1

因为你永远不会*添加*多一个线程函数;你*声称*你通过添加原型成员到类*声明*,但你从未*实现*它(至少你已经在这里显示)。 – WhozCraig 2013-03-17 13:59:58

+0

你读过错误信息了吗?是什么让你认为链接器错误与多线程有关? – stakx 2013-03-17 14:45:34

+0

@stakx:当然我阅读错误信息..我认为这是关于多线程的原因是因为当我删除了一个线程函数时,它可以被成功构建。 – eaglesky 2013-03-18 13:41:46

回答

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::告诉我定义什么功能的编译器。如果我没有这样做,函数定义将被视为在全局名称空间(或者您当前正在使用的任何名称空间)中定义一个新函数。

相关问题