2013-03-17 88 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::告訴我定義什麼功能的編譯器。如果我沒有這樣做,函數定義將被視爲在全局名稱空間(或者您當前正在使用的任何名稱空間)中定義一個新函數。

相關問題