-4

我写了一个可以在另一个线程中做一些工作的类:

    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.

但是,当我删除其中一个线程函数时,它可以成功构建。因此,我猜错误的原因是关于线程函数的。但是我还是不明白为什么不能在我的课堂上再增加一个线程函数???

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

谢谢!

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

4

1 回答 1

2

从链接错误来看,您可能从未定义过 function 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::用来告诉编译器我正在定义什么函数。如果我不这样做,函数定义将被视为在全局命名空间(或您当前正在工作的任何命名空间)中定义一个新函数。

于 2013-03-17T13:59:31.283 回答