Ошибка перехвата dm-скрипта с "Анализом частиц"

При выполнении

ChooseMenuItem("Analysis", "Particles", "Analyze Particles") 

Я иногда получаю сообщение об ошибке "Неверный индекс". Есть ли способ отловить эту ошибку? Делая это,

try {
    ChooseMenuItem( "Analysis", "Particles", "Analyze Particles" )
}
catch {
    okdialog("error")
}

не ловит ошибку. Ошибка "Недопустимый индекс", вероятно, является ошибкой после выполнения действия меню "Анализ частиц". Кто-нибудь может указать, как отловить эту ошибку? И выяснение происхождения этой ошибки является большим плюсом. Я использую GMS 1.84.

2 ответа

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что анализ частиц выполняется (хотя бы частично) в отдельном фоновом потоке.

Я не верю, что в этом случае можно напрямую отловить эти исключения.

Я больше не использую GMS 1.84, но я попробовал кое-что на GMS 3.2, что вы также можете сделать, чтобы лучше понять, что происходит.


Во-первых, ваш цикл Try/Catch в порядке, но если вы не поместите 'break' в catch, то, тем не менее, исключение будет повышено до системы, как только секция catch будет оставлена, то есть вы часто захотите сделать:

Try{ 
    ... }
Catch{
    ...
    break
}
...

Чтобы проверить, как скриптинг ведет себя при исключениях из вызываемого метода, я сначала написал небольшой скрипт и "установил" его как команду меню, один раз с и без фоновой многопоточности. Я установил их через File-menu в меню Custom с именами команд BT и nBT соответственно:

// $BACKGROUND$
Result( "\nStart and wait" )
number i = 0
while( i < 100 ){
    i++
    sleep(0.05)
    if ( ShiftDown() ) break
    if ( OptionDown() ) Throw("Broken")
    Result( "." )
}
Result("\nDone and exit.")

а также

Result( "\nStart and wait" )
number i = 0
while( i < 100 ){
    i++
    sleep(0.05)
    if ( ShiftDown() ) break
    if ( OptionDown() ) Throw("Broken")
    Result( "." )
}
Result("\nDone and exit.")

Затем я использовал функцию "ChooseMenuItem()", чтобы выполнить тестирование в следующем сценарии:

string name = TwoButtonDialog("Background threaded?", "yes", "no" ) ? "BT" : "nBT"
number success = 0
Try{
    Result( "\n Calling: " + name )
    success = ChooseMenuItem("Custom","",name)
}
catch
{
    Result("\n Caught exception." )
    break
}
result("\n Success: " + success )

Тестируя эту комбинацию (и используя клавишу ALT, чтобы вызвать исключение в подпрограмме), я мог убедиться, что команды ведут себя так, как и следовало ожидать:

  • Если процедура началась ChooseMenuItem команда запускается в главном потоке, затем выполнение этого вызова блокирует основной скрипт до его завершения - либо в его конце, либо когда он выдает исключение. Основной скрипт правильно перехватывает исключения и печатает результат.
  • Если процедура началась ChooseMenuItem Команда запускается в отдельном (фоновом) потоке, затем основной сценарий продолжается немедленно. ChooseMenuItem сразу возвращается успешно (если он может запустить команду), и цикл Try/Catch завершается. Любое исключение, вызванное вызываемой подпрограммой в фоновом потоке, больше не будет перехвачено.

Что касается источника ошибки: сообщение "Недопустимый индекс" указывает на некоторый объект, удаляемый (или сохраняемый в области действия) основным сценарием, который, как ожидается, будет там (или больше не будет) вызываемой фоновой подпрограммой. Это может быть image или imageDocument или отображение изображения или любого объекта (ROI, mask...) в imageDisplay.

Я подозреваю, что ваш основной сценарий выполняет такие вещи, как закрытие изображений после их использования? Если "анализ" находится в отдельном потоке, ваш основной сценарий может быть слишком быстрым или слишком медленным и привести к синхронизации. Возможно, вам придется добавить искусственные паузы (sleep()) и более сложная система отслеживания изображений (с использованием идентификаторов изображений) в основном скрипте, чтобы избежать подобных вещей.

С помощью ChooseMenuItem() Это обходное решение, поэтому любое решение для предотвращения ошибок для вашей проблемы, скорее всего, также является взломом кода, требующим некрасивой "креативности".

Нашел частичный ответ. У меня есть две похвалы ChooseMenuItem("Analysis","Particles","Analyze Particles"),

ChooseMenuItem("Analysis", "Particles", "Close") 
ChooseMenuItem("Analysis", "Particles", "Find Particles") 

Ошибка происходит на 2-й похвалы. Но это вызвано первой похвалой. Это должно быть ошибкой в ​​GMS 1.84, где "закрывающее" действие выбрасывает индекс частиц из синхронизации. Ошибка исчезла при комментировании первой рекомендации (действие "Закрытие").

Другие вопросы по тегам