![](image/doc.gif)
tree:能不能提供设计思路?
(发表于2002-10-28 20:40:00)
![](image/doc.gif)
lxt:太大肯定不好全部放到内存里面去,分块会好一些,如果使用同步读,很多CPU时间就花在等待上面,所以使用重叠IO实现异步读,没有数据之前只能等第一块先读完,读完第一块以后马上发出读第二块的指令,在第二块读进来之前可以进行第一块数据的处理。大大节省了时间。写文件也是一样的,这就是所谓重叠IO的好处了。
有个难处就是分块的时候有可能数据读到一行的中间,只好不辞劳苦先记下来,下一次再读的时候合并到完整的行来处理。
还有个冬冬是监控状态的显示,用 postmessage最好了。
这个东西有个不好弄的地方是想在处理中间暂停的实现,我处理得很别扭。
不知道为什么,用CBuilder总是不放心,一出问题就第一怀疑编译器(或许是翻版的惩罚?),总是要用VC重写一次,也好用boundchecker查漏子。
但是用VC做界面某种程度上简直是苦力活。
微软如果能做到CBuilder这样的类库封装就好了。DotNet或者做得更好了,然而对虚拟机的反抗情绪。。。还是一个光溜溜的Exe文件比较爽一点。
唉。。。麻烦啊
(发表于2002-10-31 1:30:00)
![](image/doc.gif)
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)
![](image/doc.gif)
lxt:不好意思,前些天工作很忙。
1、处理异常比如文件打不开。
2、注意读写长度,如果分配缓冲区空间不够就不好了。
3、既然想要异步操作,不要这样等待ReadFile返回。应该等待hEvent激活。(WaitForSingleObject),否则多半会返回“重叠IO正在进行中”。
4、关闭句柄。
5、delete掉new到的内存。
如下是我的程序:
(发表于2002-11-2 14:48:00)
![](image/doc.gif)
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---------------------