Ошибка перехвата 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, где "закрывающее" действие выбрасывает индекс частиц из синхронизации. Ошибка исчезла при комментировании первой рекомендации (действие "Закрытие").