2010-11-25 2 views
3

J'ai eu chevauchement IO travaillant depuis 2 ans maintenant mais je l'ai utilisé avec une nouvelle application et son chuck cette erreur chez moi (quand je cache le formulaire principal).E/S superposées et ERROR_IO_INCOMPLETE

J'ai googlé mais je ne comprends pas ce que l'erreur signifie et comment je devrais le gérer?

Des idées?

Im en utilisant ce sur NamedPipes et l'erreur se produit après avoir appelé GetOverlappedResult

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

Regardez, je sais que les E/S superposées se rapportent aux opérations d'E/S; Sockets, Disques etc '. Tu ferais mieux de nous dire quel genre d'E/S vous faites et quelle est l'erreur EXACT que vous obtenez. – Poni

+0

@poni Voir mon édition – Lodle

Répondre

6

ERROR_IO_INCOMPLETE est un code d'erreur signifie que l'opération chevauché est toujours en cours; GetOverlappedResult renvoie la valeur false car l'opération n'a pas encore abouti.

Vous avez deux options - blocage et non bloquant:

bloc jusqu'à ce que l'opération se termine: changer votre GetOverlappedResult appel à:

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

Cela garantit que l'opération chevauché a terminé (c.-à- réussit ou échoue) avant de renvoyer le résultat.

Sondage pour l'achèvement: si l'opération est toujours en cours, vous pouvez revenir de la fonction, et effectuer d'autres travaux en attendant le résultat:

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 */ 
} 

En général, la deuxième option est préférable à le premier, car il n'entraîne pas l'arrêt de votre application et n'attend pas de résultat. (Si le code s'exécute sur un thread séparé, cependant, la première option peut être préférable.)

+0

J'ai essayé de changer Attendre à vrai. Je viens de rentrer le détroit. – Lodle

+0

Oups, je voulais dire ça. Je vais mettre à jour la réponse. –

+1

Dans quelle partie de votre code est défini 'data-> oOverlap', c'est-à-dire quelle fonction est appelée en premier? –