2011-01-13 2 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

답변

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

여전히 오류가 발생하여 정확한 정보를 제공 할 수 있습니까? –

+0

@Chicko, 예제가 추가되었습니다. – bdonlan

0

:

다음은 간단한 예제?

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

여기서는 threadfn()이 정적이라고 가정합니다.

1

태그에 따라 MFC를 사용 중입니다. CreateThread은 Win32 C API이며, 대신 CWinThread을 봐야합니다.

+0

CThread를 사용하면 스레드에 여러 데이터를 전달하는 방법은 무엇입니까? MSDN 때문에, CWinThread * AfxBeginThread ( CRuntimeClass * pThreadClass, INT nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0 DWORD dwCreateFlags = 0 LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL )에있어서; LPVOID lpParam이 없습니다. –

+0

'CWinThread'에서 클래스를 파생시킵니다. 추가 데이터는 단순히 'this' 포인터를 통해 액세스되는 멤버가됩니다. 캐스팅이나 다른 포인터 마법사가 필요하지 않습니다. – MSalters

관련 문제