Kurze Frage zu WaitForSingleObject()



  • Hallo, ich hab da ne da Frage zu WaitForSingleObject(). Ist das nicht dafür da dass auf ein Signal gewartet wird, aber gleichzeitig der Programmablauf fortgesetzt wird? Bei mir bleibt er genau an dem Aufruf stehen und wartet. In meinem Beispiel wird also nur einmal "Test" ausgegeben, dann wird gewartet. Gebe ich "exit" ein wird ein weiteres mal "Test" ausgegeben und dann wird wohl wieder am Aufruf gewartet

    Das hier ist ein Nebentread

    DWORD WINAPI ThreadMain(LPVOID param)
    {
    
     while(1){		   
    		   Sleep(3000);
    		   printf("Test\n");
     WaitForSingleObject(eventHandle, INFINITE);
     }
    
    return 0;
    }
    

    Das ist der Main-Thread. Der obige Thread soll gestartet werden und alle 3 Sek "Test" ausgeben. Währenddessen kann man jederzeit eine Eingabe machen die dann wieder gleich auf dem Bildschirm ausgegeben wird. Wenn die Eingabe "exit" entspricht soll der Nebentread abgebrochen werden.

    eventHandle = CreateEvent(0,FALSE,FALSE,"ende");
    
      threadHandle = CreateThread(	0, // keine Security
    										0, // default-Stack
    										ThreadMain,
    										0, // kein Parameter
    										0, // normal erzeugen, Creation Options
    										&threadId // threadId
    									  );
     while(1){
    	 printf("Zeug eingeben: \n");
    	  fgets(msg,ARRAY,stdin);
    	  printf("Eingegeben: %s\n",msg);
    	  if(strcmp(msg,"exit\n")==0) {
    				SetEvent(eventHandle);
    				break;
    			}
     }
    


  • WaitForSingleObject(eventHandle, INFINITE);
    

    ist blockierend weil du als Wartezeit INFINITE angegeben hast. Das Programm durchläuft also eine Thread-Schleife nur einmal bis es bei WaitForSingleObject angekommen ist, anschließend wartet es unendlich lange bis das Event gesetzt wurde.

    Versuch mal folgendesals Thread-Funktion:

    DWORD WINAPI ThreadMain(LPVOID param)
    {
    
     while(1){           
               if( WaitForSingleObject(eventHandle, 3000) == WAIT_OBJECT_0 )
                   return 0;
               printf("Test\n");
     }
    
    return 0;
    }
    

    WaitForSingleObject wartet dann entweder 3000 ms (und gibt WAIT_TIMEOUT zurück), oder gibt WAIT_OBJECT_0 zurück falls das Event gesetzt wurde.


Log in to reply