奇怪的问题。也许有人可以提供一些见识。
我什至可以告诉您生成的文件将被破坏,因为主应用程序窗口/窗体确实像被重新粉刷一样略有闪烁。当发生这种情况时,就好像位图和TMemoryStream的每个句柄都被杀死/刷新,因此现有数据已损坏。
有任何想法吗?这真糟透了。尤其是当每个单个图像需要花费一个小时才能创建时,才发现它在完成时发现后台发生了某些事情并损坏了位图或TMemoryStream。
有什么方法可以像使用位图一样锁定TMemoryStream句柄吗?这可能会有所帮助。或通过一些声明来告诉Delphi:“即使应用程序花费的时间太长,也不要弄乱我的对象”
还是有人知道Delphi内部的后端原因导致这种情况发生。
TMemoryStream是在执行所有计算的过程中创建的,因此是一个本地对象。对于位图问题,位图是过程之外的全局变量,它发生了,所以我认为这不是原因。
在Windows 7下也是如此,但是我注意到Vista下的原始位图问题。
更新1:
很抱歉没有使用注释,但是文字大小有限制。
回复雷米(及其他阅读此书的人)...
单线程。对于内存流,如果计算速度很快,则在5000x5000分辨率下可以正常工作,但如果校准速度较慢,则无法工作。
作为基本框架,代码遵循以下原则:
SetupMemorystream;
for y:=0 to height do
for x:=0 to width do
DoCalcs;
SetByteValue;
end;
end;
SaveStream;
如果DoCalcs相对较快,那么一切都会按计划进行。如果速度很慢,那么我会损坏TMemoryStream并将流保存到的结果位图也损坏了。
这与使用内存中的TBitmap相同,直到我发现可以锁定位图,这会阻止Delphi和/或Windows“在需要时”为其重新分配新的句柄,这会破坏位图中的数据。
这太巧合了,以至于不能认为TMemoryStream及其句柄不会发生相同的问题。
更新2:
可能还有一点有用的信息。
当TMemoryStream保存确定时,结果文件(对于5000x5000位图)的大小为75,000,054字节。
当保存的流损坏时,它似乎是一个随机值(从句柄损坏到保存流为止的大小)。示例大小分别为22 MB和9 MB。
当我查看生成的文件是一个十六进制编辑器时,它表明文件的开头与 header 块是正确的,但是尾端以某种方式被截断了。
真奇怪无论如何,我绝对可以确定在SaveToFile调用之后并释放它之前刷新TMemoryStream吗?
最佳答案
干杯