有请:boyla(土著巫师),给俺们讲解"管理内存"那贴的答案

copy_paste 2003-06-25 04:01:59
http://expert.csdn.net/Expert/topic/1924/1924573.xml?temp=1.017398E-02

我想很多人都关注那贴吧

小小意思,来,喝杯茶先,慢慢开导开导俺们...
...全文
72 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
土著巫师 2003-06-26
  • 打赏
  • 举报
回复
TO ALL:

1、首先对大家表示报谦(昨天因为老婆电话催着吃饭没能写出自己的一点小认识)。
2、其次我的程序现在确实没有前面讨论的内存问题了,终究是什么原因我也没深思。不过我把我的想法、做法说出来供大家参考:
A:我的文件读写用的是TFileStream类。就这个类的使用我也发过一个贴子,见:
http://expert.csdn.net/Expert/topic/1740/1740746.xml?temp=.8246729
B:有一本书叫《windows 核心编程》,MS版权,机械工业出版社发行,里面有点内容是说如何管理虚拟内存的,同时说读写文件时大量的文件I/O会使用系统弱化,尢其是大文件,(不知道150M一个算不算大?),所以我把中心放在文件I/O上,经简单测试后发现如果程序不进行文件落盘等动作,在网络上内存使用OK。
C:TFileStream类构造函数对文件的使用是用FileOpen和FileCreate,这两个最终是使用MS WIN SDK函数:CreateFile(...),我改写了这两个函数做了一点优化如下:
//SysUtils.pas原来的
(*function FileOpen(const FileName: string; Mode: LongWord): Integer;
const
AccessMode: array[0..2] of LongWord = (
GENERIC_READ,
GENERIC_WRITE,
GENERIC_READ or GENERIC_WRITE);
ShareMode: array[0..4] of LongWord = (
0,
0,
FILE_SHARE_READ,
FILE_SHARE_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE);
begin
Result := Integer(CreateFile(PChar(FileName), AccessMode[Mode and 3],
ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0));
end;*)
//SysUtils.pas改过的
function FileOpen(const FileName: string; Mode: LongWord): Integer;
const
AccessMode: array[0..2] of LongWord = (
GENERIC_READ,
GENERIC_WRITE,
GENERIC_READ or GENERIC_WRITE);
ShareMode: array[0..4] of LongWord = (
0,
0,
FILE_SHARE_READ,
FILE_SHARE_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE);
begin
Result := Integer(CreateFile(PChar(FileName),
AccessMode[Mode and 3],
ShareMode[(Mode and $F0) shr 4],
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH or FILE_FLAG_RANDOM_ACCESS,
0
)
);
end;
//SysUtils.pas原来的
(*function FileCreate(const FileName: string): Integer;
begin
Result := Integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
end;*)
//SysUtils.pas改过的
function FileCreate(const FileName: string): Integer;
begin
Result := Integer(CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH or FILE_FLAG_RANDOM_ACCESS,
0
)
);
end;
我把SysUtils.pas、ffmt.asm加入项目中,同时把se.asm也COPY进自己的项目目录内。删除TDS文件、OBJ文件、REBUILD后试用,OK了。CreateFile提供的这两个参数对我这个程序可能很重要:一个是一定的实时性要求,一个是大量的随机访问。

3、最后愿BCB、DELPHI程序员能够多多交流共同进步,以后有什么问题还望大家多多帮助,重新申明:我可不是接分来的:),分对我来说实在是没什么意义。(我30岁才吃程序员这行钣,C++学了3年多一点)
everlasting 2003-06-26
  • 打赏
  • 举报
回复
一群蹭分的,再加一个倒分的
BS!
yingyys 2003-06-26
  • 打赏
  • 举报
回复
人呢
ThinkX 2003-06-26
  • 打赏
  • 举报
回复
很不错的做法,在最需要优化的地方才优化。
耙子 2003-06-26
  • 打赏
  • 举报
回复
我也30了,从来都没人要。呵呵
warton 2003-06-26
  • 打赏
  • 举报
回复
说完了??木头结账了!!
warton 2003-06-26
  • 打赏
  • 举报
回复
30岁才吃程序员这行钣?厉害!
(我30岁就没人要了!555)
GaoLun 2003-06-26
  • 打赏
  • 举报
回复
to 木头,我倒, 要死人了, 你跑那里去了
GaoLun 2003-06-26
  • 打赏
  • 举报
回复
to pazee


你的全名是不是linquan?
LanceX 2003-06-26
  • 打赏
  • 举报
回复
千呼万唤没出来?
耙子 2003-06-26
  • 打赏
  • 举报
回复
木头,我也要分!
ljwwjh 2003-06-26
  • 打赏
  • 举报
回复
up
copy_paste 2003-06-26
  • 打赏
  • 举报
回复
原来是这个问题。
我以前写过一个小测试,也就频繁写文件的原故,写四个字节就需要写一次文件,硬盘唧唧嘎嘎的响个不停(倒没注意虚拟内存),后来学FlashGet,用了X的内存作缓存,写数据先写到内存里,满了后,再写到文件,呵呵,情况好多.而且速度也好多了,好像是:不使用内存写文件好半个小时,用了后,只要5-6分钟,文件的大小在200-300M左右.感觉比较好,呵
lihonggen0 2003-06-26
  • 打赏
  • 举报
回复
warton 2003-06-25
  • 打赏
  • 举报
回复
还不过来??
chifengwatch 2003-06-25
  • 打赏
  • 举报
回复
听课...
「已注销」 2003-06-25
  • 打赏
  • 举报
回复
听课
Behard 2003-06-25
  • 打赏
  • 举报
回复
坐下来听课
GodBirdFlying 2003-06-25
  • 打赏
  • 举报
回复
占个位置先!
warton 2003-06-25
  • 打赏
  • 举报
回复
?
加载更多回复(8)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧