Frage zum Verhalten "WaitForMulitpleEvents"



  • Hallo Leute,

    ich habe ein "WaitForMulitpleEvents" und warte auf Event A und Event B, das ganze läuft in ner Schleife, ungfähr so:

                    HANDLE hArray[2];
    		hArray[0] = _eventA
    		hArray[1] = _eventB;
    
    		while (true)
    		{
    			DWORD dwRes = WaitForMultipleObjects(2, hArray, FALSE, INFINITE);
    			
    			// exit loop
    			if (dwRes == WAIT_OBJECT_0 + 1)
    			{
    				break;
    			}
    					
    			if (dwRes == WAIT_OBJECT_0)
    			{
                           // do something else
                            }
                  }
    

    Wenn nun EventA gesetzt wird, und zum Zeitpunkt "do something else" dann EventB. Wird das dann bei
    "WaitForMultipleObjects" registriert. wenn er wieder da wartet, nein oder?

    wenn nein, wie kann ich das Problem lösen?;)



  • Wenn die Events nacheinander eintreffen, ist es ja gerade so, daß jedes einzeln bei WaitForMultipleObjects zurückgegeben wird (egal ob dieses schon vorher aktiviert wurde).
    Problem kann es nur bei gleichzeitigem Auftreten der Events geben (für bWaitAll = FALSE), da dann nur der Event mit dem niedrigeren Index signalisiert wird (der/die anderen Event(s) behalten ihren Signalisierungsstatus).
    Wenn "exit" bei dir eine höhere Priorität haben soll, dann sollte es das erste Event in dem Array sein (so daß nicht ein Dauersignal des anderen Events dieses blockiert).

    Daher wird generell auch empfohlen, hierfür nur manuelle Events zu benutzen (und nicht automatische) und dann selber den Status aller Events im Array abzufragen.

    s.a. Question about WaitForMultipleObjects() behavior

    PS: Thema sollte nach "WinAPI" verschoben werden...



  • Falls du nicht Events verwenden musst würde ich raten statt dessen eine Mutex + Condition-Variable zu verwenden.
    Ist mMn. meist viel einfacher zu verstehen.



  • Sorry für die späte Antwort, hatte Urlaub;)

    @Th69 sagte in Frage zum Verhalten "WaitForMulitpleEvents":

    Wenn die Events nacheinander eintreffen, ist es ja gerade so, daß jedes einzeln bei WaitForMultipleObjects zurückgegeben wird (egal ob dieses schon vorher aktiviert wurde).
    Problem kann es nur bei gleichzeitigem Auftreten der Events geben (für bWaitAll = FALSE), da dann nur der Event mit dem niedrigeren Index signalisiert wird (der/die anderen Event(s) behalten ihren Signalisierungsstatus).
    Wenn "exit" bei dir eine höhere Priorität haben soll, dann sollte es das erste Event in dem Array sein (so daß nicht ein Dauersignal des anderen Events dieses blockiert).
    Daher wird generell auch empfohlen, hierfür nur manuelle Events zu benutzen (und nicht automatische) und dann selber den Status aller Events im Array abzufragen.
    s.a. Question about WaitForMultipleObjects() behavior
    PS: Thema sollte nach "WinAPI" verschoben werden...

    ja selbst wenn ich das _exitEvent an erster stelle des HANDLE Array lege, bleibt das ding inWaitForMultipleObjects hängen, da diese ja gesetzt wird bevor er wieder ins warten geht..bzw. die WaitForMultipleObjects erreicht.
    hmm.. wie könnte ich das dennoch lösen!? kann ich das event mehr mal triggern1?

    @hustbaer sagte in Frage zum Verhalten "WaitForMulitpleEvents":

    Falls du nicht Events verwenden musst würde ich raten statt dessen eine Mutex + Condition-Variable zu verwenden.
    Ist mMn. meist viel einfacher zu verstehen.

    hi, leider geht das nicht da ich das WaitForMultipleObjects verwenden muss weil ich zum einem auf die seriele schnittstelle horche, und zum einen ob daten ankommen



  • Dann stelle mal auf "manual reset events" um, so daß du selber im Code den Status wieder zurücksetzt.



  • Nicht ganz ernst gemeinter Vorschlag: du könntest IO Completion Ports verwenden 😁



  • @Th69 sagte in Frage zum Verhalten "WaitForMulitpleEvents":

    Dann stelle mal auf "manual reset events" um, so daß du selber im Code den Status wieder zurücksetzt.

    ohh , guter vorschlag , schau ich mal;)

    @hustbaer sagte in Frage zum Verhalten "WaitForMulitpleEvents":

    Nicht ganz ernst gemeinter Vorschlag: du könntest IO Completion Ports verwenden

    hmm im notfall;)

    Euch eine schöne Woche schonmale;)


Anmelden zum Antworten