2010-11-25 54 views
3

私は2年間I/Oをオーバーラップしていましたが、新しいアプリケーションとそれを私のメインのフォームを隠すときにこのチャッキングで使用しました。IOとERROR_IO_INCOMPLETEが重複しました

私はグーグルではありますが、エラーが何を意味し、どのように処理する必要があるのか​​理解できません。

アイデア?

イムNamedPipesの上にこれを使用して重複操作がまだ進行中であることを意味するエラーコードである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

重複したI/OはI/O操作に関連しています。ソケット、ディスクなど '。あなたはあなたがやっているI/Oの種類と、あなたが得ている正確なエラーを教えてください。 – Poni

+0

@poni私の編集を参照してください – Lodle

答えて

6

ERROR_IO_INCOMPLETE呼び出した後でエラーが起こります。 GetOverlappedResultは、操作がまだ成功していないため、falseを返します。

あなたは二つの選択肢がある - のブロッキングとノンブロッキング:にごGetOverlappedResultの呼び出しを変更します:

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

これは、重複した操作(すなわちを完了したことを確認し、操作が完了するまで

ブロックを成功または失敗)を返します。完成のため

投票:操作がまだ進行中であるならば、あなたは関数から戻ることができ、その結果を待っている間に他の作業を実行します。

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

一般的に、2番目のオプションは、より望ましいですアプリケーションが停止して結果を待つことはありません。ただし、コードが別のスレッドで実行されている場合は、最初のオプションが優先される可能性があります。

+0

私は本当に待ちを変更しようとしました。ちょうど戻りました。 – Lodle

+0

おっと、私はそれを意味しました。私は答えを更新します。 –

+1

コードのどの部分に 'data-> oOverlap'が設定されていますか - つまり、どの関数が最初に呼び出されたのですか? –

関連する問題