2013-06-01 3 views
0

while (1) продолжается в цикле событий, даже если событие перезагружено. ниже мой код. Я упомянул о реальном вопросе в комментариях внутри кода, где проблема лежит. Заранее спасибо за любую помощь :)Событие не сбрасывается с использованием ResetEvent()

DWORD WINAPI workerThreadProcedure(LPVOID lparam) 
    { 
     printf("===Worker Thread===\n");  
      // Initialize the critical section one time only. 
     if (!InitializeCriticalSectionAndSpinCount(&cs, 
      0x00000400)) 
      return 0; 
     int num = LOWORD (lparam); 
     struct node* cur; 
     struct node* disp = NULL; 
      EnterCriticalSection(&cs); 
      printf("Worker Thread in critical section\n");cur =cread(); 
      cur->rollno = num; 
       cur->n=NULL; 
      push(cur); 
      SetEvent(data_available_event); // signal sender thread that data is available 
      LeaveCriticalSection(&cs); 
     return 0; 
    } 
    DWORD WINAPI senderThreadProcedure(LPVOID lparam) 
    { 
     printf("===Sender Thread===\n");   
      while(1) 
     { 
      printf("Inside While\n"); 
      WaitForSingleObject(data_available_event,0); 
      EnterCriticalSection(&cs); 
      printf("Sender Thread in critical section\n"); 
      sendBuff = pop(); 
      if(sendBuff == NULL) 
       { 
        ResetEvent(data_available_event); 
        printf("Data not available anymore"); 
        continue; 
           /*Here what I want is if sendBuff is NULL, 
    it resets the event and again go back to while(1) and again waits for 
    data_available_event. But what actually happens it when sendBuff becomes NUll, it 
    prints "Data not available anymore", goes to while(1) and even there is no 
    data_avaialble_event, it again enters critical section, again prints "Data not 
    available anymore" again go to while and again enters critical section and this cycle 
    runs infinietly :(*/ 

       } 
      itoa(sendBuff->rollno,sendBuffer,10); 
      printf("%s\n",sendBuffer); 
      //printf("%d\n",disp->rollno); 
      LeaveCriticalSection(&cs); 
      printf("Sender Thread LEFT critical section\n"); 

      send(AH_glb_socketIdentifier,sendBuffer,strlen(sendBuffer),0); 
      Sleep(1); 
     } 
     return 0; 
    } 

ответ

1

события должен быть создан с параметром bManualReset ИСТИНА, чтобы сделать ResetEvent() работает.

1

На самом деле, вы забыли вызов LeaveCriticalSection в проверке if (sendBuff == NULL). Вероятно, это блокирует поток Writer.