-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.

ただし、スレッド関数の 1 つを削除すると、正常にビルドできます。したがって、エラーの理由はスレッド関数に関するものだと思います。しかし、クラスにスレッド関数をもう 1 つ追加できない理由がまだわかりませんか???

誰かがもっと説明できることを願っています。

ありがとうございました!

詳細: 申し訳ありませんが、コードを貼り付けたときに何か問題が発生しました..両方のスレッド関数を実装しました.実装しなかった場合、エラーはこのようにはなりませんよね?

4

1 に答える 1

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::定義している関数をコンパイラに伝えるために使用していることに注意してください。これを行わなかった場合、関数定義は、グローバル名前空間 (または現在作業している名前空間) で新しい関数を定義するものと見なされます。

于 2013-03-17T13:59:31.283 に答える