gpt4 book ai didi

delphi - 处理被释放以某种方式损坏?

转载 作者:行者123 更新时间:2023-12-03 15:13:25 24 4
gpt4 key购买 nike

奇怪的问题。也许有人可以提供一些见解。

  • 场景一 .我在内存中有一个 TBitmap,它是在进行复杂计算以计算每个像素的颜色时写入的。每隔一段时间(通常在位图被填充的每条水平线之后),TBitmap 被绘制到表单上的图像(image1.Canvas.Draw(0, 0, TBitmap)。大多数时候这工作正常,但我注意到如果每个位图行都有许多缓慢的复杂计算(比如需要超过 30 秒或一分钟的时间来计算),那么主窗体会有一个瞬间的“闪烁”,以某种方式删除位图,因此 image.draw 调用只绘制最新计算的行和前 y 行在位图中被消隐。我通过在计算之前锁定位图来解决这个问题。
  • 场景二。这是主要的麻烦。我正在写入 TMemoryStream 而不是位图。同样的交易。进行计算以计算每个像素值,然后在此过程中使用 memstream.Write(bytevalue, 1) 将每个像素值写入 TMemoryStream。在所有计算结束时,我使用 memstream.SaveToFile('whatever.bmp') 将流保存到位图,然后使用 memstream.Free 释放流。如果计算很快,那么无论大小如何,流都会保存(我正在使用 10000x10000 尺寸进行测试)。

  • 我什至可以判断生成的文件将被损坏,因为主应用程序窗口/表单确实有轻微的闪烁,就像它正在重新粉刷一样。当这种情况发生时,就好像位图和 TMemoryStream 的每个句柄都被杀死/刷新,因此现有数据被破坏。

    有任何想法吗?这真的很糟糕。特别是当每个图像可能需要一个小时才能创建时,才发现当它完成时在后台发生了一些事情并损坏了位图或 TMemoryStream。

    有什么方法可以像使用位图一样锁定 TMemoryStream 句柄?这可能会有所帮助。或者一些声明告诉 Delphi“不要弄乱我的对象,即使它看起来应用程序花费的时间太长”

    或者有谁知道导致这种情况发生的 Delphi 内部的后端原因。

    TMemoryStream 是在执行所有计算的过程中创建的,因此它是一个本地对象。对于位图问题,位图是程序外的全局变量,它发生了,所以我认为这不是原因。

    这也是在Windows 7下,但我注意到Vista下的原始位图问题。

    更新 1:

    很抱歉没有使用评论,但对文本大小有限制...

    回复 Remy(以及其他阅读本文的人)...

    单线程。对于内存流,如果计算速度快,它可以在 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 保存 OK 时,结果文件(对于 5000x5000 位图)的大小为 75,000,054 字节。

    当保存的流损坏时,它似乎是一个随机值(从句柄损坏到保存流的大小)。示例大小为 22 MB 和 9 MB。

    当我查看生成的文件时,它是一个十六进制编辑器,它显示文件的开头与头块是正确的,但尾部以某种方式被截断。

    这太奇怪了。无论如何,我绝对可以确定在 SaveToFile 调用之后和释放它之前刷新 TMemoryStream?

    最佳答案

  • 在将每个字节写入内存流之前,将容量设置为比特流的近似大小,以便它不会经常重新调整内存大小。这将加快速度
  • 我认为你必须从 for 循环中的 Height 和 Width 中减去 1

  • 干杯

    关于delphi - 处理被释放以某种方式损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1904898/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com