多线程编程之事件同步

#include <Windows.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

// hEventReadComplete: “读完成通知”事件对象
HANDLE hEventReadComplete = NULL;

// hEventWriteComplete: “写完成通知”事件对象
HANDLE hEventWriteComplete = NULL;

DWORD WINAPI ReadThread(LPVOID lp);
DWORD WINAPI WriteThread(LPVOID lp);

// 存储读取的内容
std::vector<char> g_vecContent;

int main(int argc, char *argv[])
{
	// 创建手动触发、未触发的事件对象
	hEventReadComplete = CreateEvent(NULL, TRUE, FALSE, NULL);
	if (!hEventReadComplete)
	{
		cout << "事件对象创建失败." << endl;
		cin.get();
		return 0;
	}

	HANDLE hThreads[2]={0};

	hThreads[0] = CreateThread(NULL, 0, ReadThread, NULL, 0, NULL);
	hThreads[1] = CreateThread(NULL, 0, WriteThread, NULL, 0, NULL);

	cout << "等待读写线程结束." << endl;
	WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);


	cout << "按任意键退出" << endl;
	cin.get();
	return 0;
}

DWORD WINAPI ReadThread(LPVOID lp)
{
	cout << "正在读取文件..." << endl;

	HANDLE hFile = CreateFile("鲁迅阿Q正传.TXT", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
		return -1;

	const int BUFSIZE = 2048;

	DWORD dwFileSize = SetFilePointer(hFile,0, 0, FILE_END);//取得文件大小
	SetFilePointer(hFile, 0, 0, FILE_BEGIN);

	while (true)
	{
		DWORD dwCurrentPos = SetFilePointer(hFile, 0, 0, FILE_CURRENT);// 获取当前位置
		if (dwCurrentPos == dwFileSize)
			break;
		
		SetFilePointer(hFile, dwCurrentPos, 0, FILE_BEGIN);//恢复位置

		char chBuffer[BUFSIZE] = {0};
		DWORD dwReadSize = 0;// 存储实际读取的字节数
		if (!ReadFile(hFile,chBuffer, BUFSIZE, &dwReadSize, NULL))
			return -2;

		// 将chBuffer在的内容存储到g_vecContent中
		copy(chBuffer, chBuffer+strlen(chBuffer), back_inserter(g_vecContent));
	}

	CloseHandle(hFile);// 关闭打开的文件

	cout << "read file success." << endl;

	// 将读取的内容输出到标准输出(即屏幕)
	//copy(g_vecContent.begin(), g_vecContent.end(), ostream_iterator<char>(cout, ""));
	
	// 设置事件对象为触发状态(等待该事件对象的线程会被系统唤醒,从而有机会执行)
	SetEvent(hEventReadComplete);
	
	return 0;
}

DWORD WINAPI WriteThread(LPVOID lp)
{
	// 等待“读完成通知”事件对象
	DWORD dwRet = WaitForSingleObject(hEventReadComplete, INFINITE);
	if (WAIT_TIMEOUT == dwRet)
		return -1;
	else if (WAIT_FAILED == dwRet)
		return -2;

	// 将事件对象设置为未触发状态
	ResetEvent(hEventReadComplete);

	HANDLE hFile = CreateFile("test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
		return -3;

	if (g_vecContent.empty())
		return -4;
	
	int nSize = g_vecContent.size();
	int nOffset = 2048;
	int nPos = 0;

	while (nPos != nSize)
	{
		char szBuffer[2048]={0};
		DWORD dwWriteBytes = 0;// 存储实际写入的字节数

		if (nPos + nOffset >= nSize)
		{
			nOffset = nSize - nPos;
		}

		memcpy(szBuffer, &g_vecContent[nPos], nOffset);

		nPos += nOffset;
			
		if (!WriteFile(hFile, szBuffer, strlen(szBuffer), &dwWriteBytes, NULL))
			return -4;
	}

	CloseHandle(hFile);

	cout << "write file success." << endl;
	

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值