2013-12-09 3 views
0

다른 스레드를 사용하여 다른 COM 포트에서 데이터를 열고 다운로드하는 테스트 콘솔 응용 프로그램을 만들려고합니다. 데이터를 다운로드 한 후 WaitForMutipleObjects()를 사용하여 모든 스레드에서 다운로드가 완료 될 때까지 기다립니다.WaitforMultipleObjects() 함수를 사용할 때 스레드가 실행되지 않습니다.

WaitForMultipleObjects(nThreadCount,m_threadHandle,true,INFINITE); 

하지만 작동하지 않고 스레드가 실행되지 않고 반환됩니다. 여기 내 스레드 함수입니다.

void* Test::GetData(void *p) 
{ 
    Test *pThis = (Test *)p; 
    string strCOMport; 
    int nChannelNo,nBaudRate; 
    cout<< " Enter COM port "<<endl; 
    cin>>strCOMport; 
    cout<< " Enter Channel Number"<<endl; 
    cin>>nChannelNo; 
    cout<< " Enter Baud Rate "<<endl; 
    cin>>nBaudRate; 

    if(pThis->InitPort(nChannelNo,0x00,(unsigned char *)strCOMport.c_str(),nBaudRate,0x00) == 0x00) 
     cout<< "Init port Success"<<endl; 
    else 
    { 
     cout<< "failed"; 
     return NULL; 
    } 
    // download 
    ExitThread(0); 
} 

이들은

작성하고 각각 스레드를 대기하는 기능입니다
void Test::init() 
{ 
    m_threadHandle[nThreadCount] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetData,(LPVOID)this,0,&m_dwThreadID[nThreadCount]); 
    nThreadCount++; 
} 

void Test::WaitForThreads() 
{ 
    WaitForMultipleObjects(nThreadCount,m_threadHandle,true,INFINITE); 
} 

왜 스레드 기능이 갑자기 반환?

답변

3

스레드 프로 시저의 서명이 잘못되었습니다. 캐스트를 사용하여 코드를 컴파일했음을 유의하십시오. 코드는 아마 원래 말했다 :

CreateThread(..., GetData, ...); 

그리고 컴파일러는 타입 LPTHREAD_START_ROUTINE의 매개 변수와 호환되지 것을 말하는 GetData에 반대. 불행히도 당신은 잘못된 해결책을 선택했습니다. LPTHREAD_START_ROUTINE으로 전송하면 실제로 GetDataLPTHREAD_START_ROUTINE이 아닙니다. 컴파일러를 닫을뿐입니다. 여기

CreateThread(..., (LPTHREAD_START_ROUTINE)GetData, ...); 

, GetData은 여전히 ​​ LPTHREAD_START_ROUTINE 아니지만, 지금 컴파일러는 자신에서 당신을 저장할 수 없습니다.

올바른 서명이 있으려면 GetData을 선언해야합니다.

DWORD WINAPI GetData(LPVOID lpParameter); 

그리고 비 멤버 함수 또는 정적 멤버 함수 여야합니다.

이 모든 사항을 수정하면 더 이상 ExitThread()으로 전화하지 않아도됩니다. 스레드 기능에서 return 0을 간단하게 쓸 수 있습니다.

+2

또한'CreateThread()'가'nThreadCount'를 증가시키기 전에 실제로 성공했는지 확인해야합니다. 그렇지 않으면 잘못된 핸들을 WaitForMultipleObjects()에 전달할 것입니다. –

+0

@RemyLebeau 어떻게'CreateThread()'가 성공했는지 어떻게 알 수 있을까요? –

+0

@BrianLeishman 설명서를 읽는 것으로 시작하십시오. 그것은 : * __ 반환 값 __이 함수가 성공하면 반환 값은 새 스레드의 핸들입니다. 함수가 실패하면 반환 값은 NULL입니다. 확장 된 오류 정보를 얻으려면 GetLastError를 호출하십시오. * –

관련 문제