统计文件未接收的部分
2013-12-22 09:21
459 查看
#ifndef FILESTATE_H #define FILESTATE_H #include <afxtempl.h> typedef struct _FILE_PART_UNRECV { double dPos1; double dPos2; }FILE_PART; typedef CList<FILE_PART> UnRecvSet; class FileState { public: UnRecvSet urs;//未接收的块的集合 double dPerPos;//之前的接收位置 double dCurrentPos;//现在的接收位置 public: FileState(); void RecvToOffPos(double dOffPos); void DragToPos(double dCurPos); private: double GetFilePartRightPos(double dPos); //int GetUnRecvPart(FILE_PART *pfpu); }; #endif//FILESTATE_H
#include "FileState.h" FileState::FileState() { dPerPos=0.0; dCurrentPos=0.0; FILE_PART fp; fp.dPos1=0; fp.dPos2=100; urs.AddHead(fp); } double FileState::GetFilePartRightPos(double dPos) { double dTempPos=dPos; int nCount=urs.GetCount(); for (int i=0;i<nCount;i++) { POSITION pos=urs.FindIndex(i); FILE_PART fp=urs.GetAt(pos); if ( fp.dPos1<=dTempPos && dTempPos<fp.dPos2) { return fp.dPos2; } } return -1.0;//for error. } void FileState::RecvToOffPos(double dOffPos) { //移动限定在一个块中。不能跨块移动。相对移动。 double dRight=GetFilePartRightPos(dCurrentPos); if (dRight<0.0) { return; } if ((dRight-dCurrentPos)<dOffPos) { dOffPos=dRight-dCurrentPos; } int nCount=urs.GetCount(); for (int i=0;i<nCount;i++) { POSITION pos=urs.FindIndex(i); FILE_PART fp=urs.GetAt(pos); if ( fp.dPos1<=dCurrentPos && dCurrentPos<fp.dPos2) { urs.RemoveAt(pos); if ((dRight-dCurrentPos)==dOffPos) { //do nothing but 重新设置dCurrentPos,从一个区域中获取左值。 FILE_PART fp=urs.GetNext(pos); dCurrentPos=fp.dPos1; } else { dCurrentPos=dCurrentPos+dOffPos; FILE_PART fp; fp.dPos1=dCurrentPos; fp.dPos2=dRight; urs.AddHead(fp); } } } } void FileState::DragToPos(double dCurPos) {//拖拽只是一个分割过程,它并没有实际的操作,只是把一个区域分为两个区域而已。 double dTempCurPos=dCurPos; int nCount=urs.GetCount(); for (int i=0;i<nCount;i++) { POSITION pos=urs.FindIndex(i); FILE_PART fp=urs.GetAt(pos); if (fp.dPos1<=dTempCurPos && dTempCurPos<=fp.dPos2) { if (fp.dPos1==dTempCurPos || dTempCurPos==fp.dPos2) { dCurrentPos=dTempCurPos; dPerPos=dTempCurPos; break; } //以下为不相等情况的处理 urs.RemoveAt(pos); FILE_PART fp1; FILE_PART fp2; fp1.dPos1=fp.dPos1; fp1.dPos2=dTempCurPos; urs.AddHead(fp1); fp2.dPos1=dTempCurPos; fp2.dPos2=fp.dPos2; urs.AddHead(fp2); dCurrentPos=dTempCurPos; dPerPos=dTempCurPos; } } }
相关文章推荐
- Centos系统设置
- frame和bounds的区别
- 用javascript实现简体和繁体字间的转换
- mapreduce测试
- ASP.NET中的XML和JSON
- 150个JS特效脚本
- 【转】C++ char数组转化为string
- 使用wxPython的绘图模块wxPyPlot进行数据可视化
- 信息安全开发注意事项(四)
- Linux学习笔记 ——准备
- 1523:从上往下打印二叉树 @jobdu
- 双核CPU,跑程序会报rcu_sched_state detected stalls on CPUs/tasks 错误
- ngx_epoll详解
- 01_三位数@xfile
- yum服务器设置
- SNMP--Windows API--SnmpUtilOidCmp
- 你是否也有NIH综合症
- Mat::create
- 【转】如何在Mac上撰寫C++程式
- poj 1125