2010-11-25 6 views
3

Ich habe IO seit 2 Jahren gearbeitet, aber ich benutze es mit einer neuen Anwendung und seinen Fehler auf mich (wenn ich das Hauptformular ausblenden).Overlapped IO und ERROR_IO_INCOMPLETE

Ich habe gegoogelt, aber ich verstehe nicht, was der Fehler bedeutet und wie ich damit umgehen soll?

Irgendwelche Ideen?

Im mit dieser über NamedPipes und der Fehler passiert, nachdem GetOverlappedResult Aufruf

DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500); 

//check result. Get correct data 

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE); 

// error happens here 
+2

Ich weiß, dass sich überlappende E/A-Operationen auf E/A-Vorgänge beziehen. Steckdosen, Festplatten etc. Sie sagen uns besser, welche Art von E/A Sie gerade machen und was genau der Fehler ist, den Sie bekommen. – Poni

+0

@poni Siehe mein Edit – Lodle

Antwort

6

ERROR_IO_INCOMPLETE ist ein Fehlercode, der bedeutet, dass der überlappte Betrieb noch im Gange ist; GetOverlappedResult gibt false zurück, da die Operation noch nicht erfolgreich war.

Sie haben zwei Möglichkeiten - Sperrung und non-blocking:

blockieren, bis der Vorgang abgeschlossen ist: zu Ihrem GetOverlappedResult Anruf ändern:

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE); 

Dies stellt sicher, dass der überlappte Vorgang abgeschlossen ist (dh Erfolg oder Misserfolg), bevor das Ergebnis zurückgegeben wird.

Poll für die Fertigstellung:, wenn der Vorgang noch nicht abgeschlossen ist, können Sie von der Funktion zurückgeben kann, und andere Arbeiten durchführen, während für das Ergebnis warten:

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE); 
if (!fSuccess) { 
    if (GetLastError() == ERROR_IO_INCOMPLETE) return; // operation still in progress 

    /* handle error */ 
} else { 
    /* handle success */ 
} 

Im Allgemeinen ist die zweite Option vorzuziehen der erste, da Ihre Anwendung nicht stoppt und auf ein Ergebnis wartet. (Wenn der Code jedoch in einem separaten Thread ausgeführt wird, ist die erste Option möglicherweise vorzuziehen.)

+0

Ich habe versucht zu ändern Warten Sie auf wahr. Gerade zurückgekehrt. – Lodle

+0

Ups, das habe ich so gemeint. Ich werde die Antwort aktualisieren. –

+1

In welchem ​​Teil Ihres Codes ist 'data-> oOverlap' gesetzt - d. H. Welche Funktion wird zuerst aufgerufen? –