#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;
}
多线程编程之事件同步
最新推荐文章于 2022-10-26 22:56:20 发布