2013-08-06 2 views
0

이 문제를 해결하는 방법을 궁금합니다.CreateThread가 내 코드에서 작동하지 않습니다.

이 코드에서
DWORD threadFunc1(LPVOID lParam) 
{ 
    int cur = (int)lParam 
    while(1) 
    { 
     //Job1... 

     //Reason  
      break; 
    } 
    Start(cur + 1); 
    Sleep(100); 
} 

void Start(int startNum) 
{ 
    .... 
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)threadFunc1, &startNum, 0, &dwThreadId); 
    ... 
} 

void btnClicking() 
{ 
    Start(0); 
} 

는 스레드가 Start()하여 만든이 및 스레드가 종료 될 때 그것은 Start()를 호출

나는 CreateThread()이 코드에서 잘 작동하지 않는 것을 알 수 있습니다.

두 번째로 생성 된 스레드가 작동하지 않습니다. 첫 번째 스레드가 사라지고 두 번째 스레드가 파괴 된 것 같습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

OS : Win 7 64bit Ultimate. 도구 : Visual Studio 2008.

+1

를 사용한다 MFC를 사용하는 프로그램에서 ['afxBeginThread'] (http://msdn.microsoft.com/en-us/library/s3w9x78e.aspx) 'CreateThread' 대신에. –

+1

음, 로컬 변수에 포인터를 전달한 다음 스레드 프로 시저에서 정수로 캐스팅합니다. 이것은 혼란을 일으키는 경향이 있습니다. (또한 : 스레드 프로 시저가 잘못 선언되었습니다. 무엇이 잘못되었는지'(LPTHREAD_START_ROUTINE) 캐스트를 제거하십시오.) –

답변

0

코드에 버그가있어 작동하지 않습니다. 스레드 함수의 서명이 잘못되어 startNum 값을 잘못된 방식으로 스레드에 전달하고 있습니다.

대신을 시도해보십시오

DWORD WINAPI threadFunc1(LPVOID lParameter) 
{ 
    int cur = (int) lParameter; 

    while(1) 
    { 
     //Job1... 

     //Reason  
      break; 
    } 

    Start(cur + 1); 
    Sleep(100); 
} 

void Start(int startNum) 
{ 
    .... 
    HANDLE hThread = CreateThread(NULL, NULL, &threadFunc1, (LPVOID) startNum, 0, &dwThreadId); 
    if (hThread != NULL) 
    { 
     // ... store it somewhere or close it, otherwise you are leaking it... 
    } 
    ... 
} 

void btnClicking() 
{ 
    Start(0); 
} 
+0

유출이 원인입니까? 하지만 스레드 func의 끝에서 어쩌면 내가 생각하는 자기 그것을 종료합니다. – bTagTiger

+0

나는 startNum func을 전달하는 것이 잘못이라고 생각하지만,이 문제는 주된 잘못이 아닙니다. 두 번째 스레드가 작동하지 않는 이유를 더 명확하게 알고 싶습니다. 감사합니다 – bTagTiger

+0

정확히 "작동하지 않는"것은 무엇입니까? 좀 더 구체적이어야합니다. 'CreateThread()'가 NULL 핸들을 반환합니까? 'threadFunc1()'이 호출되지 않습니까? 또는 아직 표시하지 않은 스레드 코드 내부에서 실제로 발생하는 문제입니까? 스레드 종료에 관해서는 자원을 해제하기 위해 스레드 사용을 마친 후에도 열려있는 핸들을 닫아야합니다. –

관련 문제