如果我在线程中使用DeleteImage()而不是CloseImage(),那么似乎存在差异 - 但我只能猜测。有没有人有明确的定义?
更多细节: 在线程内,图像A具有ROI。如果用户删除了ROI,我也想关闭图像A,但是稍后在线程中仍然会再次使用它 似乎当我使用A.deleteImage()时,我必须重新定义该图像,而如果我使用A.CloseImage() - 我不会。
看起来这就是正在发生的事情,但如果有人确切知道,请告诉我。
谢谢
答案 0 :(得分:2)
为了解决命令,您需要了解如何管理内存对象。
只要存在有效的内存对象,任何内容都将保留为有效的内存对象。
如果是图片,请将其转换为:
只要至少满足下列条件之一,图片就会保留在内存中 是的:
- 图像显示在屏幕上
- 脚本变量指向图像
- 任何其他DM例程都有一个指向图像的变量
单个图像可以同时满足上述条件中的多个条件。 从内存中删除图像的唯一方法是,确保删除对它的所有引用。
对于显示的图像,这意味着"关闭"显示器。作为用户,您可以点击" X"的窗口。脚本命令CloseImage()
调用相同的功能。请注意,对未显示的图像使用此命令不会执行任何操作。请注意,关闭图像不会删除任何变量或对此图像的引用。
对于脚本变量,这意味着你不得不以#34; unlink"来自图像的变量。 (与使用:=
来解决它相反。)这是通过DeleteImage()
命令完成的。或者,也可以直接将变量分配给NULL指针,如img := NULL
对于从DM 持有的引用,你无能为力,你也不应该这样做。如果某个例程需要图像,那么它将保留。您可以关闭人机界面,但您永远无法将其删除。这就是为什么你经常可以找到'图像,甚至使用他们的标签显示它们。相机参考图像就是一个很好的例子,但也有其他的。
通过上面给出的解释,您应该能够理解以下示例中的不同行为:
void CloseTest( number ShowItFirst )
{
image img := realImage( "Test", 4, 100, 100 )
Result( "\n Assignment: Image is valid:" + img.ImageIsValid() )
if ( ShowItFirst )
{
img.ShowImage()
Result( "\n Displaying: Image is valid:" + img.ImageIsValid() )
}
img.CloseImage()
Result( "\n Closing: Image is valid:" + img.ImageIsValid() )
img.ShowImage()
Result( "\n Displaying: Image is valid:" + img.ImageIsValid() )
}
void DeleteTest( number ShowItFirst )
{
image img := realImage( "Test", 4, 100, 100 )
Result( "\n Assignment: Image is valid:" + img.ImageIsValid() )
if ( ShowItFirst )
{
img.ShowImage()
Result( "\n Displaying: Image is valid:" + img.ImageIsValid() )
}
img.DeleteImage() // This is the same as: img := NULL
Result( "\n Deleting: Image is valid:" + img.ImageIsValid() )
// img.ShowImage() // This fails, because image is no longer valid!
}
现在还应该清楚,为什么人们可以使用CloseImage( A )
而不是DeleteImage( A )
来显示标签A
的图像:
第一个命令只想关闭标签引用的图像的图像显示。然而,第二个想要解开'来自图像的脚本变量。但标签' A'不是脚本变量!