(200+)帮忙分析一下内存泄漏问题!!(200分)

  • 主题发起人 主题发起人 Sachow
  • 开始时间 开始时间
看了一下你的帖子
屏保好象是作一个*.scr的文件,你怎摸自己load起图片来了
我给你发个例子,希望对你有帮助。
 
我未检验
Q:
How do I register my Screen saver so Windows picks it up in the control
panel Desktop Dialog. The Application Name begins with SCRNSAVE and it
still does not register.

A:
a) In the project file (*.dpr) add '{$D SCRNSAVE <saver name>} after the
uses clause.

b) On the main form, turn off the border and icon controls. In the
activate method set the form left and top to 0, and set the Windowstate
to wsMaximize.

c) In the form create method, set the application.OnMessage to a method
that controls the deactivation of the screen saver. Set the
application.OnIdle method to whatever display method for the saver.

d) In the form create method the command line should be tested for /c and
/s. These are the command line parameters windows uses to define whether
the screensaver should run or configure. (/c is for configuration)

e) Compile the program, and rename the .exe to .scr. Move it to the
windows directory, and it should show up in the control panel.
 
牛头不对马嘴!
 
我在发给你一份制作*.scr的程序
 
做屏幕保护程序用cbuilder, delphi等都不是很好的选择, 工作量太大了,而且效果
不一定好, 倒是可以选择用flash做, 对公司的广告宣传有利。
 
cactus123456: 谢谢你,你发的两个邮件我都收到了。我想你大概还不太清楚我现在的需求,
现在我的屏幕保护程序已经做完了,从处理参数到设置信息、预览、数据打包、切换图片所
有的功能都完成了,程序分两部分,一部分是专门用来打包的,另一部分是用来解包和播放
图片、音乐等效果的,我现在所需要解决的就是内存利用中的问题,而不是其它的。
另外,我想说一点(这不太礼貌),你发给我的那两个小程序很有趣,但看起来更像个小玩
具,而不是一个符合商业要求的程序,其中的后者我只运行了两次,它就让我的系统出了错。
 
两个小程序我认为已经包含了大部分的原理了,特别是第二个的Mainfrm的FormCreate和FormActivate
当然不可能给你一个满足你全部要求的,不然要我们这些程序员干身末。
另外提醒你一下,你的系统是不是有问题,建议你格式化你的计算机,重装系统
 
我现在越来越怀疑是线程与VCL不同步的问题,由于我的画图函数和读取图片函数就是定义
在主窗体中,属于主窗体类的成员方法,而这些方法又是被一个线程对象调用的,该线程的
Execute()未使用Synchronize与VCL对象同步,是不是问题就出在这里?线程与VCL不同步,
以致于图还没画完就开始读取图片,并再次画图?(但奇怪的是看起来很正常,只是内存泄
漏得厉害)如果同步以后又不能很好地接受窗体消息(在击键和移动鼠标时不能立即终止程
序),用一个Timer来做代替线程也是相同的结果。
 
画图函数应该放到线程中
扑获击键和移动鼠标时终止线程
timer和线程是两回事,在ontimer中执行的程序仍是在主程序中运行.
如果timer来代替线程也是相同的结果,那末根本不是线程与VCL不同步的问题。
我认为你就应该在开始屏保之前将所有的图片(2-3幅作个实验)都读入内存,
不要释放,看看是否还有内存泄露,如果还有,我看你的程序结构就有问题了.
 
终于上来了,昨天一整天都进不来!
我昨天把问题解决了,嗨!其实这只是一个小问题,只是大家都忙于研究MIS方面的问题去
了,对图像处理中这样的小问题却是无暇顾及。实际上问题并不是出在线程不同步上,而
是出在图像格式转换上,这正符合我一开始的怀疑:
...
else if (PicInfo[PicIndex].FileType == 2){ //资源为Jpeg图片
//tmpjpg是一个TJPEGImage*,由FormCreate时初始化
//怀疑以下两句可能有导致内存泄漏的因素
tmpjpg->LoadFromStream(MM);
<font color=red><B>Dest->Assign(tmpjpg);</B></font> //正是这一句是罪魁祸首!
}
...
正确的方法应该是:
Dest->Width = tmpjpg->Width;
Dest->Height = tmpjpg->Height;
Dest->Canvas->Draw(0,0,tmpjpg);
只能画上去,而不能Assign!(反过来,Bmp转为JPEG时却是可以用Assign的),通过Assign
把一幅JPEG赋给Bmp,看起来一切正常,但内存却不会被释放。我拷!害得我这么苦!

我的200大分哪,啧啧……这不等于花200分来给人上一堂课吗……
不行,我要再问两个小问题,心理才平衡。(立即发分)
1、怎么调用默认的浏览器来打开一个网站?我用ShellExecute结果不行:
ShellExecute(Handle,"open","http://netit.com.cn/",0,0,SW_SHOW);
2、暂不问,也许不用问了。
 
为什么ShellExecute(Handle,"open","http://netit.com.cn/",0,0,SW_SHOW)不能调用浏览
器打下网址呢?我见到这样的例程的呀,大家给点意见嘛!
 
ShellExecute(0, 'open', 'http://www.evgesoft.com/dev/indexreg.html',
nil, nil, SW_SHOWNORMAL);
 
硬盘响了一声就没动静了。你那里试了行吗?(我估计是行的,只是我的系统有问题,我们
另一个同事的也是一样)
 
我这里没问题,所以说你应该格式化你的硬盘了
 
不用动不动就格式化硬盘吧!重装Win98就可以了。
马上就发分。
 
多人接受答案了。
 
后退
顶部