2012-01-04 3 views
0

매개 변수 3 또는 설정에 무엇이 잘못 되었습니까?CreateThread 매개 변수 오류가 발생했습니다.

error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)' 
     None of the functions with this name in scope match the target type 

-

void CNumbergeneratorDlg::OnBtn3() 
{ 
    //CreateThread 
    hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL);//<--is "this" correct 

    WaitForSingleObject(hThread1,INFINITE); 
    TerminateThread(hThread1,0); 
    CloseHandle(hThread1); 
} 

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue) 
{ 
    CreateNumber(); 
    return 0; 
} 

??? 입력 ... 감사

가 "이"

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue) 
{ 
    (CDialog)iValue->CreateNumber(); 
    return 0; 
} 

xxxxxxxxxxxxxxx입니다 xxxxxxxxxxxxxxx입니다

이 내가 당신의 사람들과 함께 무슨 짓을 캐스팅

void CNumbergeneratorDlg::OnBtn3() 
{ 
    //CreateThread 
    CNumbergeneratorDlg *pp = this; 
    hThread1 = CreateThread(NULL, 0, Thread1, pp, 0, NULL); 

// WaitForSingleObject(hThread1,INFINITE); 
// TerminateThread(hThread1,0); 
// CloseHandle(hThread1); 
} 

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue) 
{ 
    CNumbergeneratorDlg *pp = (CNumbergeneratorDlg*)iValue; 

    pp->CreateNumber(); 
    return 0; 
} 

void CNumbergeneratorDlg::CreateNumber() 
{ 
    long m; 
    j = 0; 
    for(long i = 0; i < 1000;i++){ 
     m = 0; 
     for(long k = 0; k < 1000000;k++){ 
      m ++; 
     } 

     j++; 
    } 

    AfxMessageBox("Done count"); 
    TerminateThread(hThread1,0); 
    CloseHandle(hThread1); 
} 

void CNumbergeneratorDlg::OnBtn4() 
{ 

    TerminateThread(hThread1,0); 
    CloseHandle(hThread1); 

    CString c; 
    c.Format("%d", j); 
    MessageBox(c); 
} 
+0

정적 스레드 프로 시저 기능이 필요합니다. 인스턴스 구성원과 통화 할 수 없음 – Gayan

답변

0

당신은 static 멤버 함수로 기능 Thread1를 선언 했 CNumbergeneratorDlg에? 그렇지 않은 경우 그렇게하십시오.

비 정적 클래스 함수에는 this에 대한 암시 적 추가 매개 변수가 있습니다. 따라서 유형 캐스팅이 작동하지 않습니다. 반면 정적 메서드는 this 매개 변수를 전달하지 않습니다.

그러면 Thread1 내에서 반원에게 어떻게 접근 할 수 있는지 궁금해 할 것입니다. 일반적인 기술은 을 통해 iValue을 전달합니다.

+0

무엇을 의미합니까? – jdl

+0

'Thread1'의 선언에'static'을 넣습니다 ... – minjang

+0

오류 메시지의 선언에 따라 CreateThread()는 void * 유형의 멤버 중 하나를 매개 변수로 취하는 함수를 필요로합니다. 비 정적 멤버 함수는 매개 변수로 개체 ("this")에 대한 암시 적 포인터를 사용하기 때문에 이러한 자격을 부여하지 않습니다. 이 함수가 취할 수있는 유일한 멤버 함수는 정적입니다. 이 함수도 C 호출 규칙을 사용해야하는 것으로 보이기 때문에 작동하지 않을 수도 있습니다. –

2

Thread1은 비 정적 멤버 함수입니다. 이 클래스를 호출하려면 클래스의 인스턴스 (CNumbergeneratorDlg)가 필요합니다. 그래서 그 오류가 발생합니다. 스레드를 생성 할 때

당신은 Thread1 정적 확인하고 매개 변수에 의해 this을 전달할 수 : 당신은 CreateThread에게 그것을 기대 서명이없는 클래스 메소드를 전달하기 위해 노력하고

class CNumbergeneratorDlg { 
    void OnBtn3() { 
     hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL); 
     // ... 
    } 
public: 
    static DWORD Thread1(LPVOID lpdwThreadParam) { 
     CNumbergeneratorDlg *instance = 
      static_cast<CNumbergeneratorDlg *>(lpdwThreadParam); 
     // do something with instance. 
    } 
}; 
3

합니다. 모든 메소드의 첫 번째 인수는 Thread1의 경우 CNumbergeneratorDlg *와 같은 유형의 this 포인터입니다.

당신이해야

: 클래스 외부

당신이이 상황에서 정적 사용하는 방법을 보여주는 정적 방법에 관한 기사입니다

http://adilevin.wordpress.com/2009/06/07/createthread-an-example/

또한 전화 협약 ('__stdcall'비트)을 이해하려면 다음을 읽어 보시기 바랍니다.

http://msdn.microsoft.com/en-us/library/zxk0tw93(v=vs.80).aspx

관련 문제