Ist es eine gültige Methode, 2 WaitForSingleObject in einen "if" -Zustand zu setzen? und ich weiß, dass es mit WaitForMuiltipleObject neu geschrieben werden kann. Aber ich wollte wissen, ob die Verwendung des folgenden Codes zu Problemen führen würde.

CHandle     m_hEventUDP;
CHandle     m_hEventTCP;

if (WaitForSingleObject(m_hEventUDP, 1500) == WAIT_OBJECT_0 || WaitForSingleObject(m_hEventTCP, 1500) == WAIT_OBJECT_0)
{
    //An event is triggered(among 2)
    //I don't care which event is triggered among 2, either of one is Okay for me
}

else
{
    //No event is triggered
}
-2
Raj 23 Dez. 2015 im 10:20

2 Antworten

Beste Antwort

Das wird auf den ersten warten, und wenn dies nicht geschieht (und nur dann eine Zeitüberschreitung auftritt), wird es auf den zweiten warten. Sie können eine von drei Situationen haben:

  • Beides Zeitüberschreitung. Sie nehmen sich 3 Sekunden Zeit und gelangen zum Fall "kein Auslöser".
  • Einmalig, man löst aus. Sie brauchen 1,5 Sekunden und gelangen zum "Trigger" -Fall.
  • Beide lösen aus, Sie gelangen dorthin, sobald der zweite ausgelöst wird.

Mit WaitForMultipleObjects erhalten Sie dieses Verhalten:

  • Einer wird ausgelöst, Sie gelangen dorthin, sobald der erste ausgelöst wird.
  • Bei beiden Zeitüberschreitungen dauert es 1,5 Sekunden (oder 3, wenn Sie dies angeben) und Sie gelangen zum Fall "kein Auslöser".

In Ihrem aktuellen Code wird in häufigen Fällen eine Latenz von 1,5 Sekunden hinzugefügt, die durch das Warten mehrerer Objekte vermieden wird.

2
dascandy 23 Dez. 2015 im 07:27

Dies funktioniert nicht so, wie Sie es möchten (zumindest nichts, was dem, was WaitForMultipleObjects tun würde, sehr nahe kommt). Das || erzeugt einen Sequenzpunkt, also wertet es die linke Seite aus, und genau dann, wenn dies ein falsches Ergebnis erzeugt, wertet es die rechte Seite aus.

0
Jerry Coffin 23 Dez. 2015 im 07:28