windows纤程

//下面这段代码中首先将主线程转化为主纤程,然后创建两个纤程,
//分别用来读文件和写文件,然后保存这三个纤程。并定义了一个结
//构体用来向各个纤程函数传入对应的参数。在主线程的后面首先切
//换到读纤程,在读纤程中利用源文件的句柄,读入512字节的内容,
//然后切换到写纤程,将读到的这些内容写回到磁盘的新文件中完成
//拷贝,然后切换到读纤程,这样不停的在读纤程和写纤程中进行切
//换,直到文件拷贝完毕。再切换回主纤程,最后在主纤程中删除读
//写纤程,将主纤程转化为线程并结束线程。
#include<Windows.h>
#include<stdio.h>
#include<tchar.h>
#include<Strsafe.h>

#define PRIMARY_FIBER 0
#define WRITE_FIBER 1
#define READ_FIBER 2
#define FIBER_COUNT 3
#define COPY_LENGTH 512

VOID CALLBACK ReadFiber(LPVOID lpParam);
VOID CALLBACK WriteFiber(LPVOID lpParam);

typedef struct _tagFIBER_STRUCT
{
	DWORD dwFiberHandle;
	HANDLE hFile;
	LPVOID lpParam;
}FIBER_STRUCT, *LPFIBER_STRUCT;

char *g_lpBuffer = NULL;
LPVOID g_lpFiber[FIBER_COUNT] = {};
void GetApp(LPTSTR lpPath, int nBufLen)
{
	TCHAR szBuf[MAX_PATH] = _T("");
	//得到当前模块的路径名
	GetModuleFileName(NULL, szBuf, MAX_PATH);

	int nLen = _tcslen(szBuf);
	for (int i = nLen; i > 0; i--)
	{
		if (szBuf[i] == '\\')
		{
			szBuf[i + 1] = _T('\0');
			break;
		}
	}

	nLen = _tcslen(szBuf) + 1;
	int nCopyLen = min(nLen, nBufLen);
	//进行拷贝
	StringCchCopy(lpPath, nCopyLen, szBuf);
}

int _tmain(int argc, _TCHAR* argv[])
{
	g_lpBuffer = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, COPY_LENGTH);
	FIBER_STRUCT fs[FIBER_COUNT] = { 0 };

	TCHAR szDestPath[MAX_PATH] = _T("");//目标地址
	TCHAR szSrcPath[MAX_PATH] = _T("");//源地址
	GetApp(szDestPath, MAX_PATH);
	GetApp(szSrcPath, MAX_PATH);
	//字符串连接
	StringCchCat(szSrcPath, MAX_PATH, _T("2.jpg"));
	StringCchCat(szDestPath, MAX_PATH, _T("2_Cpy.jpg"));

	HANDLE hSrcFile = CreateFile(szSrcPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	HANDLE hDestFile = CreateFile(szDestPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

	fs[PRIMARY_FIBER].hFile = INVALID_HANDLE_VALUE;
	fs[PRIMARY_FIBER].lpParam = NULL;
	fs[PRIMARY_FIBER].dwFiberHandle = 0x00001234;

	fs[WRITE_FIBER].hFile = hDestFile;
	fs[WRITE_FIBER].lpParam = NULL;
	fs[WRITE_FIBER].dwFiberHandle = 0x12345678;

	fs[READ_FIBER].hFile = hSrcFile;
	fs[READ_FIBER].dwFiberHandle = 0x78563412;
	fs[READ_FIBER].lpParam = NULL;

	//返回纤程执行上下文的内存地址
	g_lpFiber[PRIMARY_FIBER] = ConvertThreadToFiber(&fs[PRIMARY_FIBER]);
	g_lpFiber[READ_FIBER] = CreateFiber(0, (LPFIBER_START_ROUTINE)ReadFiber, &fs[READ_FIBER]);
	g_lpFiber[WRITE_FIBER] = CreateFiber(0, (LPFIBER_START_ROUTINE)WriteFiber, &fs[WRITE_FIBER]);

	//切换到读纤程
	SwitchToFiber(g_lpFiber[READ_FIBER]);

	//删除纤程
	DeleteFiber(g_lpFiber[WRITE_FIBER]);
	DeleteFiber(g_lpFiber[READ_FIBER]);

	CloseHandle(fs[READ_FIBER].hFile);
	CloseHandle(fs[WRITE_FIBER].hFile);

	//变回线程
	ConvertFiberToThread();
	return 0;
}

VOID CALLBACK ReadFiber(LPVOID lpParam)
{
	//拷贝文件
	while (TRUE)
	{
		LPFIBER_STRUCT pFS = (LPFIBER_STRUCT)lpParam;
		printf("切换到[%08x]纤程\n", pFS->dwFiberHandle);
		DWORD dwReadLen = 0;
		ZeroMemory(g_lpBuffer, COPY_LENGTH);
		ReadFile(pFS->hFile, g_lpBuffer, COPY_LENGTH, &dwReadLen, NULL);
		SwitchToFiber(g_lpFiber[WRITE_FIBER]);
		if (dwReadLen < COPY_LENGTH)
		{
			break;
		}
	}

	SwitchToFiber(g_lpFiber[PRIMARY_FIBER]);
}

VOID CALLBACK WriteFiber(LPVOID lpParam)
{
	while (TRUE)
	{
		LPFIBER_STRUCT pFS = (LPFIBER_STRUCT)lpParam;
		printf("切换到[%08x]纤程\n", pFS->dwFiberHandle);
		DWORD dwWriteLen = 0;
		WriteFile(pFS->hFile, g_lpBuffer, COPY_LENGTH, &dwWriteLen, NULL);
		SwitchToFiber(g_lpFiber[READ_FIBER]);
		if (dwWriteLen < COPY_LENGTH)
		{
			break;
		}
	}

	SwitchToFiber(g_lpFiber[PRIMARY_FIBER]);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值