2011-01-13 65 views
2

這裏是我的代碼,其中包含錯誤:如何在同一個類(C++,MFC)中調用工作線程?

void ClassA::init() 
{ 
    HANDLE hThread; 
    data thread;   // "thread" is an object of struct data 

    hThread = CreateThread(NULL, 0, C1::threadfn, &thread, 0, NULL); 
} 

DWORD WINAPI ClassA::threadfn(LPVOID lpParam) 
{ 
    data *lpData = (data*)lpParam; 
} 

錯誤:

error C3867: 'ClassA::threadfn': function call missing argument list; use '&ClassA::threadfn' to create a pointer to member 

是什麼力量讓工作線程在一個類工作的正確方法?

+0

你能解決拼寫錯誤嗎? C1 :: threadfn不會導致ClassA :: thradfn'錯誤。 – harper 2011-01-13 15:21:12

回答

0

按照警告錯誤的建議,那麼這應該工作,只要會員功能threadfnstatic

5

線程創建函數不知道C++類;因此,您的線程入口點必須是靜態類成員函數或非成員函數。您可以將this指針作爲參數lpvThreadParam傳遞給CreateThread()函數,然後讓靜態或非成員入口點函數通過該指針調用threadfn()函數。

如果threadfn()功能靜態的,然後確保你C1::threadfn之前把&

這裏有一個簡單的例子:

class MyClass { 
    private: 
    static DWORD WINAPI trampoline(LPVOID pSelf); 
    DWORD threadBody(); 
    public: 
    HANDLE startThread(); 
} 

DWORD WINAPI MyClass::trampoline(LPVOID pSelf) { 
    return ((MyClass)pSelf)->threadBody(); 
} 

DWORD MyClass::threadBody() { 
    // Do the actual work here 
} 

HANDLE MyClass::startThread() { 
    return CreateThread(NULL, 0, &MyClass::trampoline, (LPVOID)this, 0, NULL); 
} 
+0

你能爲我提供一個正確的,因爲我仍然收到錯誤 – 2011-01-13 16:02:42

+0

@Chicko,example added – bdonlan 2011-01-13 16:09:21

0

,如果你做了錯誤說的話,會發生什麼?

CreateThread(NULL, 0, &C1::threadfn, &thread, 0, NULL); // now passing pointer 

這假定threadfn()是靜態的。

1

根據標籤,您正在使用MFC。 CreateThread是Win32 C API,您應該看看CWinThread

相關問題