Overlapped IO, wie funktionierts?



  • Tag,

    ich spiele grade mit Overlapped IO rum,
    folgenden Code habe ich gefunden (leicht geändert):

    HANDLE event = CreateEvent( NULL, FALSE, FALSE, NULL );
    
    OVERLAPPED ol;
    ol.hEvent = event;
    
    if( ReadFile( comPort, buffer, 128, &bytesRead, &ol ) )
    {
       // es hat geklappt soll heißen die Daten wurden gelesen?
    }
    else
    {
        // warten
        if( ERROR_IO_PENDING == GetLastError() )
        {
            // mal sehn ob das event das passende Signal hat, 200ms timeout
            if( WAIT_OBJECT_0 == WaitForSingleObject( event, 200 ) )
            {
                // mal angenommen er spring hier rein, muss ich dann nochmal Daten auslesen?
            }
            else
            {
                // war wohl nix, timeout
            }
        }
        else
        {
            // irgendwas schiefgegangen
        }
    }
    

    Also, mir ist einfach nicht ganz klar wann er jetzt Daten gelesen hat und wann nicht.
    Danke im voraus 😉

    Gruß,

    Max



  • IMHO fehlt noch ein "GetOverlappedResult", aber sonst passt es... nur dass es natürlich in diesem Beispiel keinen Sinn macht...



  • Danke schonmal 🙂

    GetOverlappedResult Function

    Retrieves the results of an overlapped operation on the specified file, named pipe, or communications device.

    So wie ich dass verstehe bekomme ich durch GetOverlappedResult
    nur zusätzliche Informationen?

    nur dass es natürlich in diesem Beispiel keinen Sinn macht...

    Hää? 😕 Wieso dass?

    if( WAIT_OBJECT_0 == WaitForSingleObject( event, 200 ) )
            {
                // mal angenommen er spring hier rein, muss ich dann nochmal Daten auslesen?
            }
    

    Wenn er da reinspringt, hat er dann schon gelesen oder muss ich nochmal ReadFile aufrufen?

    Gruß,

    Max



  • Vermutlich ist ein synchrones ReadFile schneller als diese 20 Zeilen Code... Sinn macht es IMHO wenn
    - Du wirklich einen definierten Timeout brauchst
    - nebenher (im gleichen Thread) noch was anderes zu tun hast

    Und nein, Du musst nur noch "GetOverlappedResult" aufrufen um zu erfahren wie viel eingelesen wurde. Dann sind die Daten da...



  • Super, hat mir sehr geholfen!

    Wie mache ich denn ein synchrones ReadFile?!
    Ich muss während WaitCommEvent aufgerufen wird noch ReadFile aufrufen können!



  • blub² schrieb:

    Wie mache ich denn ein synchrones ReadFile?!

    ReadFile(......., NULL); !?


Anmelden zum Antworten