有谁能解决 Delphi 的这个 Bug?(200分)

  • 主题发起人 主题发起人 andin
  • 开始时间 开始时间
线程中磁盘操作部分要用同步函数
 
关于 Delay 与 Sleep
并不是你想象的那样啦, 如果你只是让时间去等待, 用 Delay 和 Sleep 都可以.
但如果你在等待的同时,不想让你程序中的其它进程也一起等待, 则不能用 Sleep.
 
To : softdog
磁盘操作函数没有任何的问题,也不需要用 Synchronize 函数,因为是在一个线程内访问同一个对象,没有必要用 Synchronize 函数。
你查看以下代码就知道了,TBitmap 在实现 SaveToFile 时,先需要将 DDB 转换为 DIB,这部分的代码比较复杂,问题就出在这里,至于存盘部分代码,没有任何的问题。
 
Sleep要少用,有神秘的时间调整问题,可能会使你的机器出现特别问题,
这种问题在另一台机器上可能无法再现。
 
To:maoke
Sleep 有点神秘?不会吧?
我提出的这个问题,在任何一台计算机上,都会出现,只不过时间长短不一
 
在delphi5开发人员指南上有这句话,第317页,恰好也是在线程的范例中
 
To:maoke
可是我没有这本书呀?
能否将解决问题的办法,以及问题的原因写在这里?
 
设想一下,如果两个线程同时在写'c:/ret.bmp'时问题就出现了。不管你Sleep,还是作其他
方法的延时,都有可能出现。问题就来了。
 
To:redsky.l
两个线程同时写文件,不会有问题的,因为操作系统能够保证串行处理;
在说,这个程序就一个线程在写文件,所以不是写文件的问题;

问题的原因在 Graphic.pas 存在 GDI 资源泄漏
 
大家怎么不讨论了?
 
对对想起来了。“Graphic.pas 存在 GDI 资源泄漏”有印象在哪本书上说过,
并说过了如何改写。只是现在没时间翻书,忙着写Win31下用的程序[:(]
 
楼上的朋友,请你再好好想一想。。。
怎么现在去开发 Win31 下面的程序?好古老的东西。。。
 
sleep(10);
现在计算机还不能随心所欲的乡多快就多快,特别是硬盘的存储,如果太快,windows
会存到内存的cache,如果继续,超出了这个,就会资源不足。
提示:改为sleep(1000),做个测试,如果1小时多没有问题,我说的就是对的
 
另外,我记得以前做数据采集的项目时,windows和dos的最小时间片好像是18ms,
记不太清楚了,所以sleep(1)和sleep(18)是没有区别的
 
Sleep(1) 与 Sleep(10),没有多大区别,这里主要是为了让出 CPU 进行其他处理而已,没有其他作用;
无论如何,也不能用Sleep 时间太短的原因来解释这种异常现象,因为,如果在主线程内执行同样的代码,根本不Sleep,也不会出现这样的异常
 
你用的什么系统,我用xpsp1你的程序1个小时也没问题!
 
确实业余了点。可惜 Pipi. 没进来,如果 Pipi. 来回答的话,可能会给你一个很经典又很
容易理解的回答。业余对业余,我来回答你算啦:
继承自线程类就是一个线程操作,线程操作的最大特点是线程可以不断地建立并各自独立运
行。于是必须考虑很多线程特有的事情。假设你的例子中的 btnStartClick 方法安排多个
线程实例运行的话会有什么结果?
var test :array[0..5] of TTest;
begin
for x:=0 to 5 do
begin
test[x]:= TTest.Create(False);
end;
end;
你马上可以看到写磁盘并不是你所认识的是串行操作。
还有要说的是:WriteFile 、DeleteFile 都是异步函数。
还有...唉,不罗嗦了,其他让高手来说吧。
 
To:罗西岛主
我真的不知道你是否能解决这个问题,我可以明确的给你说:
这个问题的原因不在 WriteFile 等函数的线程安全问题,你查看一下delphi 的源程序,就会发现:Delphi 以同步模式调用这些API函数的,而不是你所担心异步模式;
如果你还是不放心,干脆用 SaveToStream(MemStream) 代理 SaveToFile,你会发现这个奇怪的异常依然存在。
 
很奇怪!为什么我把你的程序开了整整一个星期六和星期天都没有问题?
环境:128M,Win2000 Pro
 
不会吧,谁能在这里解决borland公司的bug问题,那borland公司不是要喝西北风去了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
897
SUNSTONE的Delphi笔记
S
后退
顶部