в чем разница между DeleteImage() и closeImage()?

Если я использую DeleteImage() в потоке по сравнению с CloseImage(), кажется, что есть разница, но я могу только догадываться. У кого-нибудь есть четкое определение?

Более подробно: в потоке изображение A имеет область интереса. Если пользователь удалит область интереса, я также хочу закрыть изображение A, но использовать его снова позже в потоке.
Кажется, что когда я использую A.deleteImage(), мне нужно переопределить это изображение, тогда как если Я использую A.CloseImage() - я этого не делаю.

Похоже, что это то, что происходит, но если кто-то знает наверняка, пожалуйста, дайте мне знать.

Спасибо


person E Voelkl    schedule 18.04.2018    source источник


Ответы (1)


Чтобы понять команды, вам нужно понять, как управляются объекты памяти.

Все будет оставаться действительным объектом памяти, пока на него есть действительная ссылка.

В случае изображений это означает:

Изображение останется в памяти, пока выполняется хотя бы одно из следующих условий:

  • Изображение отображается на экране
  • Переменная скрипта указывает на изображение
  • Любая другая подпрограмма DM имеет переменную, указывающую на изображение.

Одно изображение может иметь несколько вышеперечисленных условий, выполненных одновременно. Единственный способ удалить изображение из памяти — удалить все ссылки на него.

Для отображаемых изображений это означает "закрыть" отображение. Как пользователь, вы должны щелкнуть «X» в окне. Та же функциональность вызывается командой скрипта CloseImage(). Обратите внимание, что использование этой команды для изображения, которое не отображается, ничего не делает. Обратите внимание, что закрытие изображения не удаляет какие-либо переменные или их ссылки на это изображение.

Для переменных скрипта это означает, что вам нужно каким-то образом "отвязать" переменную от изображения. (Противоположность использования := к его оценке.). Это делается с помощью команды 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' не является переменной сценария!

person BmyGuest    schedule 19.04.2018