谁能挑战: delphi能力pk(如今论坛上还有delphi高手吗) ( 积分: 300 )

  • 主题发起人 主题发起人 那年黄梅花开
  • 开始时间 开始时间

那年黄梅花开

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi 6 下的一套C/S软件,蛮大的。一个EXE有30MB多,窗体跟控件比较多
就是编译的时候出错了,在编译信息框上显示到 Linker...的时候 提示 out of memory
然后又会提示 ntdll.dll 错误

你能破解吗?delphi gs
 
控件太多 不要把窗体全部打开
编译就行 不要Build
 
"在 uses 里去掉不必要的引用,
功能相对独立的最好做dll.
代码部分能简化尽量简化.
控件能不用尽量不用,自己写代码实现!
"
控件太多: 木已成舟,不大可能改了,(有不少三方控件)
不要把窗体全部打开: 我试过,似乎有点改善,但还是常常报错。
编译就行,不要Build : 如何理解呢,ctrl+F9,自动编译链接,再说如果不build,我如何 运行程序来调试呢。

来吧,传说中的高手,看你是否经验老道,看你是否智慧敏锐。
 
一个EXE 30多M?上千万价值的工程?
提示 out of memory,你需要增加内存,仅此而已。
提示 ntdll.dll 错误,如果加了内存后还出现,那就重新安装delphi。
 
没有上千万,上百万了,工程浩大,业务复杂,呵呵。
增加内存,仅此而已:兄弟这么自信,呵呵;我一边等着编译一边看自己的任务管理器,内存还多着呢,再说我的机子是1g的,目前来说不算小了吧。
重装delphi?试了;
重启系统?也试了。
(我猜想是堆的分配,东分配一点,然后随即从西分配一点,太多太乱了,最后导致 什么访问××××地址错误,再然后out of memory)(一点愚见)

高手啊,来吧,come on!
 
假设这样,我如果有几十个dll.放到一个projectgroup中,然后选择buidall,
很容易出现out of memory了。
增加内存是你第一件要做的。
因为你就一个EXE,再不行,只能把某些form移出去,然后慢慢加,慢慢排除了。
看看form列表,尽量移到available forms中去,
数据集方面,不要在设计期就打开。

把工程文件除dpr文件外全部删除,再用delphi打开工程.
先想这么多吧。
 
应该是缺少必需的一些控件或者文件,会提示内存溢出。
 
太厉害了吧,一个EXE有30MB多
 
既然木已成舟,那就让舟再变成木吧。
新建一个工程,逐步将原有工程中的单元以及窗体加入到新的工程中来,保证每次添加后
都可以正常编译(当然,会需要去除一些单元引用以及跨单元的功能调用)。逐步推进,直
到发现故障点或者最终成功。
——考虑到工程价值上百万,花几天时间进行拆分和重组还是值得的。
 
同意楼上的方法
 
creation-zy的说法固然是对的,但,艾,不是万能药啊;
程序的各个模块的耦合性太强了,不好拆啊。
主要想寻找一下不重构原代码的情况下如何解决目前的异常。
(其实也不知道有没有解)
(但愿一切皆有可能!)

对于有点规模的项目,想问是用多个dll的形式多还是不用dll只用多个dpr的形式多。
我知道各有优缺点,不知大家有何体会。

我们的项目最龌龊,就一个dpr,--> I 服了 You
 
out of memory,不一定是剩余内存不足,可能是有些有限制的资源不足,不如gdi资源。
对于你的程序,我的建议是:化整为零。
把功能可以拆分为dll的,做到dll内,需要时载入。
否则,这么大的exe,编译的时候很可能耗光编译器资源。导致编译出错。
或者,试试带包编译。
 
这种情况有可能是某些DFM文件太大造成的,如静态装入大体积的图片,兄弟可以把所有的dfm文件按大小排一下序,找出最大的几个,看有没有这个问题,如果有,把这类大型资源改成动态载入的方式,也许能解决你的问题。
 
还没像你这样做过呢,都放在一个 exe 里

真是服了

应该是资源没有正常分配或释放
只是猜测,因为没有遇到过你这种情况
 
呵呵,链接过程中就 out of memory 了?那就应该是链接器出错了。

现在还在用1G内存就不算多了,但对于特定程序,比如链接器,它在链接一个项目的时候,
由于设计的时候就没有考虑无穷节点的情况,一旦链接点非常多的时候,它本身就会超出
设计容量。不过,既然还处在链接过程,你怎么就提前知道了它编译完后的大小了呢?这个
时候应该还没有变成 EXE 呀。

尝试一下 build with package。尽量把所有包都加进去,就会大量减少一个 EXE 代码段的
大小,而且可以最大限度地减少跳转表的节点,这样也许会让链接器更好受些。

另外,换一个新版本的链接器也许也会链接成功。

至于提到的“对于有点规模的项目,是用多个dll的形式....”这是由架构决定的,没有架
构而只有一团行为逻辑的项目,好像也是不存在的。即使是点 IDE 创建一个新EXE项目的时
候,就使用了Delphi的默认架构。

认清哪些是架构,哪些是逻辑,或者说理解它是什么样子的架构,就可以解答上面的疑问,
可以说没有全能的,完全是着眼点的问题。而一股脑儿都塞在一个EXE里,也没什么好指责
的,就无非是勇气问题,因为这样的程序通常比分段来写更需要毅力与耐心。
 
我也不觉得是内存大小问题,是代码导致编译器执行无限循环,不断压栈,
导致内存枯竭。这种技术我掌握。
 
以前看到10多M的EXE覺得很大很大,現在看來真是天外有天啊,一個字:牛。
 
不是很相信 这样的情况。
 
估计是垃圾工程,追求华丽的界面,压缩开发时间,用了很多第3方控件,
也没有在线更新的功能.

这样的工程以后维护起来累死.赶快模块化工程吧.
 
用 cnpack 清一些无用的uses
项目下有个Build菜单的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
810
import
I
后退
顶部