?? threadfunc.cpp
字號:
// ThreadFunc.cpp : implementation file
//
#include "stdafx.h"
#include "FileTransferClient.h"
#include "ThreadFunc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//文件傳輸完成事件
HANDLE hEvent[NumOfThread];
//接收文件
char fn[40];
//接收數(shù)據(jù)套接字
CMySocket receiveSockets[NumOfThread];
// ThreadFunc
ThreadFunc::ThreadFunc()
{
}
ThreadFunc::~ThreadFunc()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(ThreadFunc, CAsyncSocket)
//{{AFX_MSG_MAP(ThreadFunc)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// ThreadFunc member functions
//獲得一個(gè)線程要寫入文件的開始位和文件塊大小
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=0;i<ThreadIndex-1;i++)
{
lastBlockSize=lastBlockSize-BlockSize;
BeginPos+=BlockSize;
}
//如果是文件最后一塊,取得最后一塊大小
if(ThreadIndex==TotalThreads)
{
BgPos=BeginPos;
BlkSize=lastBlockSize;
}
else
{
BgPos=BeginPos;
BlkSize=BlockSize;
}
return;
}
DWORD WINAPI ReceiveThreadFunction(void * pParam)
{
int idx=(int)pParam;
//調(diào)用接收函數(shù)
ReceiveThread(idx+1);
return 1;
}
void ReceiveThread(int idx)
{
CFile file;
char data[ReadSize];
long BeginPos,Size;
long FileLength;
long WriteOnce;
char filename[200];
//命名臨時(shí)文件名
sprintf(filename,"tmpsave-%d.data",idx);
if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox("Write file error");
return;
}
WaitForSingleObject(hMessageCome[idx-1],2000);
while(SOCKET_ERROR==receiveSockets[idx-1].Receive(&FileLength,4))
{
}
WaitForSingleObject(hMessageCome[idx-1],2000);
while(SOCKET_ERROR==receiveSockets[idx-1].Receive(fn,40))
{
}
//獲取文件起始位和文件塊大小
GetBeginPos(NumOfThread,idx,FileLength,BeginPos,Size);
//讀取數(shù)據(jù)寫入臨時(shí)文件
while(Size>0)
{
WaitForSingleObject(hMessageCome[idx-1],2000);
//接收數(shù)據(jù)
if(SOCKET_ERROR==(WriteOnce=receiveSockets[idx-1].Receive(data,ReadSize)))
{
ResetEvent(hMessageCome[idx-1]);
continue;
}
Size=Size-WriteOnce;
file.Write(data,WriteOnce);
}
//關(guān)閉文件
file.Close();
//設(shè)置文件發(fā)送完成事件對象,表示本線程文件塊發(fā)送完成
SetEvent(hEvent[idx-1]);
}
//監(jiān)視線程
DWORD WINAPI MonitorFunc(void * pParam)
{
//等待所有線程文件發(fā)送完成
WaitForMultipleObjects(NumOfThread,hEvent,true,INFINITE);
//調(diào)用合并臨時(shí)文件塊函數(shù)
CombineFiles();
AfxMessageBox("文件接收完成!!");
return 1;
}
//合并臨時(shí)文件塊
void CombineFiles()
{
CFile fileDest,fileSour;
char sourname[500];
static char data[10000];
long count;
//打開目的文件
if(!fileDest.Open(fn,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox("Combine:Make Dest File Error");
return;
}
//讀取臨時(shí)文件并寫入目的文件
for(int i=0;i<NumOfThread;i++)
{
wsprintf(sourname,"tmpsave-%d.data",i+1);
//打開臨時(shí)文件
if(!fileSour.Open(sourname,CFile::modeRead))
{
AfxMessageBox("Combine:Open Part File Error");
return;
}
count=fileSour.Read(data,10000);
//寫入目的文件
while(count>0)
{
fileDest.Write(data,count);
count=fileSour.Read(data,10000);
}
fileSour.Close();
//刪除臨時(shí)文件
if(!DeleteFile(sourname))
{
AfxMessageBox("Comboine:File-Delete Error");
return;
}
}
fileDest.Close();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -