オーバーラップ操作のイベントオブジェクトによる待機(C言語)

説明:

WriteFile関数をオーバーラップ操作で実行することにより、ファイルに対して同時に5つの非同期書き込みを行う。WriteFile関数のOVERLAPPED構造体にイベントオブジェクトを指定することにより、すべての書込み操作の終了を検出する。すべての書込み操作が終了するまでの間、カウントを続ける。

サンプルコード:

#define BUFMAX 10000000
#define ASYNCNUM 5

void DoAsyncWrite()
{
	HANDLE hEvent[ASYNCNUM];
	OVERLAPPED ov[ASYNCNUM];
	DWORD cbWritten[ASYNCNUM];
	HANDLE hFile;
	char *buf;
	int i, cnt;
	DWORD result;

	/* 書き込むデータの用意 */
	buf = GlobalAlloc(GMEM_FIXED, BUFMAX);
	if(buf == NULL) {
		printf("memory error\n");
		return;
	}
	/* for(i=0; i<BUFMAX; i++) buf[i] = i%256; */

	/* 新規ファイルの作成 */
	hFile = CreateFile(
		"test.dat",
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_ARCHIVE | FILE_FLAG_OVERLAPPED | FILE_FLAG_WRITE_THROUGH,
		NULL);

	/* イベントオブジェクトの作成とオーバーラップ構造体の初期化 */
	for(i=0; i<ASYNCNUM; i++) {
		hEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);

		ov[i].Offset = 0;
		ov[i].OffsetHigh = 0;
		ov[i].hEvent = hEvent[i];
	}

	/* 非同期書き込みの実行 */
	for(i=0; i<ASYNCNUM; i++) {
		printf("書き込み開始: %d\n", i);
		WriteFile(hFile, buf, BUFMAX, &cbWritten[i], &ov[i]);
	}

	/* 書き込み終了までカウントを続ける */
	for(cnt = 0;;cnt++) {
		printf("Count: %d\n", cnt);
		result = WaitForMultipleObjects(ASYNCNUM, hEvent, TRUE, 1000);
		if(result != WAIT_TIMEOUT) break;
	}

	printf("書き込み終了\n");

	/* 後処理 */
	for(i=0; i<ASYNCNUM; i++) CloseHandle(hEvent[i]);
	
	CloseHandle(hFile);
	GlobalFree(buf);
}

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。