Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455139
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:56:46

tree:能不能提供设计思路?
(发表于2002-10-28 20:40:00)

lxt:太大肯定不好全部放到内存里面去,分块会好一些,如果使用同步读,很多CPU时间就花在等待上面,所以使用重叠IO实现异步读,没有数据之前只能等第一块先读完,读完第一块以后马上发出读第二块的指令,在第二块读进来之前可以进行第一块数据的处理。大大节省了时间。写文件也是一样的,这就是所谓重叠IO的好处了。

有个难处就是分块的时候有可能数据读到一行的中间,只好不辞劳苦先记下来,下一次再读的时候合并到完整的行来处理。

还有个冬冬是监控状态的显示,用 postmessage最好了。

这个东西有个不好弄的地方是想在处理中间暂停的实现,我处理得很别扭。

不知道为什么,用CBuilder总是不放心,一出问题就第一怀疑编译器(或许是翻版的惩罚?),总是要用VC重写一次,也好用boundchecker查漏子。
但是用VC做界面某种程度上简直是苦力活。
微软如果能做到CBuilder这样的类库封装就好了。DotNet或者做得更好了,然而对虚拟机的反抗情绪。。。还是一个光溜溜的Exe文件比较爽一点。

唉。。。麻烦啊
(发表于2002-10-31 1:30:00)

fds:to lxt:
   我下载了您的代码,剪切了CreateFile()函数到ReadFile()函数部分的代码进行编译运行,但运行到ReadFile()函数后出错,GetLastError()为87(即ReadFile()函数参数错误)不知怎么回事。劳烦您帮我看一下好吗?
void CFfDlg::OnOk() 

   //设定打开的文件是一个文本文件(已建立)。
   const  char *fileName = "e:\\test.txt";

   HANDLE hFile;  //读文件用的句柄
   DWORD  lastError;//存放错误代码的变量

   hFile =  CreateFile(fileName,//打开文件
   GENERIC_READ,
   FILE_SHARE_READ,
   NULL,
   OPEN_EXISTING,
   FILE_FLAG_OVERLAPPED,
   NULL);

  DWORD fileSize = SetFilePointer(hFile,//
    0, 
    NULL,
    FILE_END);

  HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"readEvent");

  BYTE *pbRead = new BYTE[512];//分配读文件的内存(已足够大)

  DWORD dwRead;//读入的字节数

  OVERLAPPED overlap;//用于ReadFile()函数的结构变量
  overlap.Offset     = 0;
  overlap.OffsetHigh = 0;
  overlap.hEvent     = hEvent;

  if (ReadFile(hFile,//读文件
     pbRead,
     fileSize,
     &dwRead,
     &overlap) == 0)
   {
     lastError = GetLastError();//返回87
     return;
   }
}

(发表于2002-10-31 9:16:00)

lxt:不好意思,前些天工作很忙。

1、处理异常比如文件打不开。
2、注意读写长度,如果分配缓冲区空间不够就不好了。
3、既然想要异步操作,不要这样等待ReadFile返回。应该等待hEvent激活。(WaitForSingleObject),否则多半会返回“重叠IO正在进行中”。
4、关闭句柄。
5、delete掉new到的内存。

如下是我的程序:

(发表于2002-11-2 14:48:00)

lxt:void CMyAsyncReadFileDlg::OnOK() 
{

const  char *fileName = "c:\\test.txt";

HANDLE hFile;  

hFile =  CreateFile(fileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

//Exception
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox("Îļþ´ò¿ªÊ§°Ü");
return;
}

//get file size
DWORD fileSize = SetFilePointer(hFile,//
0, 
NULL,
FILE_END);

//build event
HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,"readEvent");

//allocate read buffer
BYTE *pbRead = new BYTE[fileSize];

DWORD dwRead;

//setup overlapped io structure variable
OVERLAPPED overlap;
overlap.Offset     = 0;
overlap.OffsetHigh = 0;
overlap.hEvent     = hEvent;

//read file
ReadFile(hFile,
pbRead,
fileSize,
&dwRead,
&overlap);

//wait for event fired(read finished)
WaitForSingleObject(hEvent,INFINITE);

//process it
char sTemp[4];
memcpy(sTemp,pbRead,3);
sTemp[3]='\0';
MessageBox(sTemp);

//close handle
CloseHandle(hEvent);
CloseHandle(hFile);

//free buffer
delete pbRead;
pbRead = NULL;

CDialog::OnOK();
}
(发表于2002-11-2 14:48:00)

..........................................................................
--------------------next---------------------

阅读(284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~