2011-03-04 6 views
0

여기 ThrdFunc를 사용하여 5 개의 스레드를 생성 중입니다. 여기서 각 스레드는 listBox를 업데이트합니다.스레드가 일치하지 않는 결과를 표시합니다

나는이 방법으로 메시지를 기대하고 있었다. 처음에이 방법으로 제공하지만, 잠시 후 나는

Thread0:Adding msg 
Thread18967654:Adding msg 
Thread18967654:Adding msg 
Thread18967654:Adding msg 

같은 메시지가 시간이

Thread1:Adding msg 
Thread2:Adding msg 
Thread3:Adding msg 

후 그러나이 코드입니다 :

for (int i = 0;i<6;i++) 
    { 
     nThreadNo = i+1; 
     hWndProducer[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ProducerThrdFunc,(void*)&nThreadNo,0,&dwProducerThreadID[i]);  
     if (hWndProducer[i] == NULL) 
     { 
      //ErrorHandler(TEXT("CreateThread")); 
      ExitProcess(3); 
     } 
    } 

DWORD WINAPI ThrdFunc (LPVOID n) 
{ 
    int *nThreadNo = (int*)n;  
    char chThreadNo[3]; 
    memset(chThreadNo,0,3); 

    while(1) 
    { 
     itoa(*nThreadNo,chThreadNo,10); 
     char* pMsg1 = new char[100]; 
     char* pMsg2 = new char[100]; 
     memset(pMsg1,0,100); 
     memset(pMsg2,0,100); 

     strcpy(pMsg1," Thread No:");   
     strcat(pMsg1,chThreadNo); 
     strcat(pMsg1," Adding Msg:"); 

     PostMessage(stThreadInfoProd.hWndHandle,UWM_ONUPDATEPRODUCERLIST,(WPARAM)pMsg1,0); 


    } 
    return 0; 
} 
+0

는 nThreadNo' –

+0

nThreadNo이 쓸만은의에 사용 아니, 우리는 nThreadNo' '의 정의를 의미 ThreadFunc –

+0

내부 nThreadNo에서 수신 스레드에서 내가 값을 전달하고 스레드의 로컬 우리에게'의 선언을 제시해주십시오 고리. –

답변

3

대부분의 경우 nThreadNo는 스택에 할당됩니다. 각 스레드에게 요소 중 하나에 대한 포인터를 제공하고 있습니다.

스레드를 만드는 함수가 반환되면 배열은 더 이상 유효하지 않지만 스레드 함수는 여전히 해당 함수를 가리 킵니다. 쓰레드가 포인터를 가지고있는 메모리는 대부분 덮어 쓰여질 것이므로 원래 쓰레드 ID가 쓰레기로 덮어 쓰게됩니다.

다른 스레드를 넘기는 것은 일반적으로 malloc 형식 함수 또는 new, 바람직하게는 new을 통해 힙에 할당되어야합니다. 이는 C++이기 때문에 가능합니다.

예를 들어 int nThreadNo[6] 대신 int* nThreadNo = new int[6]을 사용하십시오. 그러나 메모리가 인 경우 delete[]을 사용해야 만한다는 것을 명심하십시오.

+0

감사합니다. dauphic.really 내 편이 바보 같은 실수였습니다. –

1

nThreadNo 당신 때문에 글로벌이어야한다 새 스레드에 대한 포인터를 제공하고 있습니다.

+0

CreateThread 함수는 메인 thread에 있습니다. 나는 for 루프를 사용하여 5 개의 쓰레드를 생성 중이고 스레드 argumrnt.i에서 i (counter for for loop)를 전달하고 있습니다.이 값을 전달하는 것은 잘못되었습니다. –

+0

내가 nThreadNo를 만들면 모든 스레드가 동일한 스레드 번호로 끝납니다.이 값을 스레드 번호 –

+0

에 전달하면 스레드 번호에 대한 포인터가 아니라 CreateThread를 호출해야합니다. 따라서 실제 스레드 번호가 있으므로 "nThreadNo "대신 (void *) & nThreadNo. 이것은 해결책이며, 황태자의 글에 대한이 표정의 이유를 알아야합니다. –

3

글쎄, 모든 코드를 제공하지 않았기 때문에 확신 할 수 없습니다.

그러나 nThreadNo은 기본 스레드의 스택에 정의 된 로컬 변수입니다. 이 변수의 주소를 스레드에 전달하고 있지만 값을 전달하거나 일부 힙 할당 메모리를 전달해야합니다.

당신이하고있는 일은 함수에서 로컬 변수에 대한 포인터를 반환하는 것과 도덕적으로 같습니다.

int* foo() 
{ 
    int i; 
    return &i; 
} 

코드 동작합니다을하는 가장 간단한 방법은 다음과 같이 변경하는 것입니다

CreateThread(..., (void*)nThreadNo, ... 

int nThreadNo = (int)n; 
관련 문제