📄 threadfunc.cpp
字号:
#include "StdAfx.h"
#include "TreadFunc.h"
#include <process.h>
//获得某个线程要写入文件的开始位和文件块大小
void GetBeginPos(int TotalThreads,int ThreadIndex, long file_length, long &BgPos, long &BlkSize)
{
long BlockSize,lastBlockSize,BeginPos;
//获得文件块平均大小
BlockSize=file_length/TotalThreads;
lastBlockSize=file_length;
BeginPos=0;
//获得第ThreadIndex块文件的开始位和大小
for(int i=1;i<=ThreadIndex-1;i++)
{
lastBlockSize=lastBlockSize-BlockSize;
BeginPos+=BlockSize;
}
//如果是文件最后一块,取得最后一块大小
if(ThreadIndex==TotalThreads)
{
BgPos=BeginPos;
BlkSize=lastBlockSize;
}
else
{
BgPos=BeginPos;
BlkSize=BlockSize;
}
return;
}
//监视线程
DWORD WINAPI MonitorFunc(LPVOID lpParameter)
{
//等待所有线程文件发送完成
WaitForMultipleObjects(NumOfThread,hEvent,true,INFINITE);
AfxMessageBox("文件发送完成!!!");
return 1;
}
//发送数据线程
DWORD WINAPI SendThreadFunction(void * pParam)
{
int idx=(int)pParam;
//调用发送文件函数
SendThread(idx+1);
return 1;
}
//发送数据函数
void SendThread(int idx)
{
//定义一些变量
CFile file;
char data[ReadSize];
//文件起始位和文件块大小
long BeginPos,Size;
long FileLength;
long ReadOnce,LeftToRead,count;
//以共享和读方式打开文件
if(!file.Open(fn,CFile::modeRead|CFile::shareDenyNone))
{
AfxMessageBox("Read file error");
return;
}
FileLength=(long)file.GetLength();
sendSockets[idx-1].Send(&FileLength,4);
WaitForSingleObject(hMessageSend[idx-1],2000);
sendSockets[idx-1].Send(fn,40);
//获得文件起始位和文件块大小
GetBeginPos(NumOfThread,idx,FileLength,BeginPos,Size);
//定位到文件开始位
file.Seek(BeginPos,CFile::begin);
LeftToRead=Size;
//读取文件并发送文件块
while(LeftToRead>0)
{
ReadOnce=(LeftToRead>ReadSize?ReadSize:LeftToRead);
count=file.Read(data,ReadOnce);
WaitForSingleObject(hMessageSend[idx-1],20);
//发送文件块
while((SOCKET_ERROR==sendSockets[idx-1].Send(data,count)))
{
}
LeftToRead=LeftToRead-count;
}
//关闭文件
file.Close();
//设置文件发送完成事件对象,表示本线程文件块发送完成
SetEvent(hEvent[idx-1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -