Мы не виноваты! Или как зациклить управляющий модуль, и что потом делать?

Природа

На самом деле виноваты именно мы, но мы хотели как лучше. Суть проблемы состоит в следующем. Все управляющие модули умеют обрабатывать сообщения от «Опиума» об изменении входных данных. Это сообщение возникает каждый раз, когда кривые или наборы границ или отсчеты изменяются в результате действий пользователя или работы управляющего модуля. При этом управляющие модули знают, какие именно параметры являются для них входными. Обычно это те кривые, имена которых пользователь выбирает из списков доступных кривых в окне управляющего модуля. Если изменяются какие-то другие параметры, то управляющий модуль ничего не делает. В противном случае, алгоритм обработки этого сообщения для разных модулей примерно одинаков, и, в конечном счете, сводится к инициализации процедуры вычислений. У всех процедур вычисления тоже есть одна сходная черта. Пересчитав данные, они сохраняют результат, записывая в «Опиум» новую кривую или несколько кривых или отсчеты и т.д. Наверное, вы уже заметили, что если создать ситуацию, когда имя входного параметра будет совпадать с именем выходного (записываемого), то это приведет к бесконечному поочередному пересчету значения выходного параметра и его записи в «Опиум» в ответ на сообщение об изменении входного параметра, возникающего после записи. То есть управляющий модуль «зациклится».

Симптомы

Обычно это выглядит так: вы запускаете управляющий модуль, например «Пористость по АК». Затем в списке «dT» выбираете (обычно случайно) кривую «kПор (АК)» (именно под таким именем сохраняется результат работы этого управляющего модуля). После этого «Опиум» и «Пористость по АК» перестают отзываться на какие бы то ни было ваши действия. Зацикливание состоялось.

Но это еще не все. Управляющие модули обычно сохраняют в файле конфигурации имена выбранных вами входных кривых. Это относится и к тому ошибочному выбору, который вы только что сделали. Даже если вы перегрузите компьютер, повторный запуск «Пористости по АК» опять приведет к зацикливанию именно по причине сохраненной с прошлого сеанса конфигурации.

Выход

Первый полезный совет такой. Если описанная выше ситуация возникла, не спешите перегружаться. Подождите 2-3 минуты. Циклический вызов программы самой из себя называется в простонародье рекурсией и имеет побочный эффект. Стековая память системы тает прямо на глазах. Именно через 2-3 минуты она истощится совсем, и это приведет к сообщению системы о переполнении стека. После этого управляющий модуль просто «слетит». Перегрузиться потом все равно придется, но в промежутке между «слетом» управляющего модуля и перезагрузкой вы можете спокойно сохранить документ «Опиум» с результатами вашей работы.

Второй совет поможет не попасть в эту же ситуацию при повторном запуске управляющего модуля. Как я говорил выше, причина повторного зацикливания состоит в том, что управляющий модуль сохранил «неправильную» конфигурацию и постарается, при повторном запуске, ею воспользоваться. Чтобы этого не случилось, найдите файл конфигурации управляющего модуля (обычно он находится там же где и управляющий модуль, имеет такое же имя и расширение «INI»). Затем откройте этот файл с помощью текстового редактора (например «Notepad») и удалите строку или строки, в которых встречается имя выходного параметра. Сохраните измененный файл и все. Можно повторно запускать управляющий модуль. Что это дает? Это приводит к тому, что некоторые списки доступных кривых при начальной инициализации останутся пустыми (ведь вы удалили информацию о том, чем они инициализировались в прошлом сеансе). Теперь вы можете указать на правильные значения для этих параметров и продолжать работу как обычно.

P.S.

Ничто не мешает нам запретить подавать на вход управляющего модуля данные с такими же именами как у сохраняемых параметров и таким способом решить проблему. Со временем мы именно так и поступим. Но пока этого не произошло, постарайтесь избегать описанной здесь ситуации, а если что, пользуйтесь советами из этой статьи.

Е.А. Полищук

назад