Глобальные переменные

Avatar
  • обновлен
Добрый день!

Занялся ревизией скриптов в свете последних изменений и дополнений в функциональность системы SimpLight.
И столкнулся с загадкой, разгадать которую не могу - прошу помощи.
Речь идет о глобальных переменных.

Глобальные переменные могут использоваться для
1. Передавать данные между скриптами
2. Особенность - сохраняют свои значения даже после выключения программы и перезагрузки ПК.

Вопрос: как "после выключения программы и перезагрузки ПК" получить значение глобальной переменной?

Ведь при старте программы в конструкции if(AsFirstRun){…} происходит объявление глобальной переменной, где ей присваивается начальное значение. Получается, что глобальная переменная получит начальное значение, и "забудет" то значение, которое содержало до выключения программы.

С уважением, Кондратенко Анатолий
Новочеркасск
Avatar
SIMP Tech (Сергей)
Прямого ответа на Ваш вопрос нет.
Когда начинал работать с глобальными переменными, то проверил их взаимодействие со строками.
Опытным путем установил, работоспособной является конструкция:


строковая_переменная="ййй"; строковая_переменная=GetGlobalVar; if(строковая_переменная="ййй") { глобальная переменная не содержит значение };

поскольку в ответ на GetGlobalVar нет порой никакого ответа, ни да, ни нет.
Отказался от пустой строки "", появилась переменная-константа PUSTO, в которой хранятся три пробела.

Сделал для пары объектов необходимые изменения в скрипте.
Помучился.
Именно тогда в начале AsFirstRun появились строки с принудительным объявлением глобальной переменной.
Отладил - работало пару недель нормально.
Давай расширять на другие объекты - опять те же проблемы: новые переменные отказываются работать, так как работают "старые".
Сегодня подумал, может быть свое влияние оказывают имена переменных на кириллице. Заменил отечественное слово "Шкаф" на импортное "Box". Удалил файл VarCache, дабы не перепутались новые имена со старыми.
Не хочет работать и всё тут. Пока не размаркируешь строку принудительного объявления и не перезапустишь программу, опять маркируешь и снова перезапуск.

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

Ок. Понял, отдам разработчикам на доп.тестирование. Анатолий, отпишитесь к нам на почту. По почте будет легче взаимодействовать, для решения этой проблемы.
Avatar
Прямого ответа на Ваш вопрос нет.
Когда начинал работать с глобальными переменными, то проверил их взаимодействие со строками.
Опытным путем установил, работоспособной является конструкция:

строковая_переменная="ййй"; строковая_переменная=GetGlobalVar; if(строковая_переменная="ййй") { глобальная переменная не содержит значение };
поскольку в ответ на GetGlobalVar нет порой никакого ответа, ни да, ни нет.
Отказался от пустой строки "", появилась переменная-константа PUSTO, в которой хранятся три пробела.

Сделал для пары объектов необходимые изменения в скрипте.
Помучился.
Именно тогда в начале AsFirstRun появились строки с принудительным объявлением глобальной переменной.
Отладил - работало пару недель нормально.
Давай расширять на другие объекты - опять те же проблемы: новые переменные отказываются работать, так как работают "старые".
Сегодня подумал, может быть свое влияние оказывают имена переменных на кириллице. Заменил отечественное слово "Шкаф" на импортное "Box". Удалил файл VarCache, дабы не перепутались новые имена со старыми.
Не хочет работать и всё тут. Пока не размаркируешь строку принудительного объявления и не перезапустишь программу, опять маркируешь и снова перезапуск.

Складывается впечатление, что какие-то проблемы в организации хранения глобальных переменных на диске.
То ли кеш выгружается на диск, только при окончании работы программы.
А программа, к стати, не всегда завершается нормально - примерно каждый третий перезапуск завершается зависанием программы, и приходится вручную снимать задачу в Диспетчере задач.
Avatar
SIMP Tech (Сергей)
Анатолий, если я правильно понял, то:

при такой записи, взамен строковой записывается числовое значение
SetGlobalVar("Box N1 timer start", "", true);

а при объявлении переменной PUSTO, работает?
SetGlobalVar("Box N1 timer start", PUSTO, true);
Avatar
SIMP Tech (Сергей)
Отец Анатолием назвал, и нет причин от этого отказываться.

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

{ int i; string PUSTO=" ", per; if(AsFirstRun) // если в глобальных переменных сохранилась какая-либо информация, то записываем ее в соответствующие каналы { //каким-то образом новой глобальной переменной присваивается числовое значение, и приходится объявлять новую глобальную строковую переменную в лоб //SetGlobalVar("Box N1 timer start", PUSTO, true); //SetGlobalVar("Box N1 timer stop", PUSTO, true); //SetGlobalVar("Box N2 timer start", PUSTO, true); //SetGlobalVar("Box N2 timer stop", PUSTO, true); //SetGlobalVar("Box N3 timer start", PUSTO, true); //SetGlobalVar("Box N3 timer stop", PUSTO, true); //SetGlobalVar("Box N4 timer start", PUSTO, true); //SetGlobalVar("Box N4 timer stop", PUSTO, true); //SetGlobalVar("Box N5 timer start", PUSTO, true); //SetGlobalVar("Box N5 timer stop", PUSTO, true); //SetGlobalVar("Box N6 timer start", PUSTO, true); //SetGlobalVar("Box N6 timer stop", PUSTO, true); //SetGlobalVar("Box N7 timer start", PUSTO, true); //SetGlobalVar("Box N7 timer stop", PUSTO, true); //SetGlobalVar("Box N8 timer start", PUSTO, true); //SetGlobalVar("Box N8 timer stop", PUSTO, true); //SetGlobalVar("Box N1 N", 0, true); //SetGlobalVar("Box N2 N", 0, true); //SetGlobalVar("Box N3 N", 0, true); //SetGlobalVar("Box N4 N", 0, true); //SetGlobalVar("Box N5 N", 0, true); //SetGlobalVar("Box N6 N", 0, true); //SetGlobalVar("Box N7 N", 0, true); //SetGlobalVar("Box N8 N", 0, true); // Шкаф №1 per = "проверка"; per = GetGlobalVar("Box N1 timer start"); if(per == "проверка") { WriteValue("Шкаф №1 timer start", PUSTO); } else { WriteValue("Шкаф №1 timer start", per); } per = "проверка"; per = GetGlobalVar("Box N1 timer stop" ); if(per == "проверка") { WriteValue("Шкаф №1 timer stop", PUSTO); } else { WriteValue("Шкаф №1 timer stop", per); } i = GetGlobalVar("Box N1 N"); if(i==0) { WriteValue("Шкаф №1 N", 0); SetGlobalVar("Box N1 N", 0, true); } else { WriteValue("Шкаф №1 N",i); } WriteValue("Шкаф №1 timer",PUSTO); WriteValue("Шкаф №1 i",0); // Шкаф №2 и т.д. таких шкафов 8 штук
Avatar
SIMP Tech (Сергей)
Добрый день, Анатолий.

Вынужден вновь вернуться к вопросу о глобальных переменных.
Не получается у нас с ними мирного существования.
Я использую глобальные переменные для сохранения строковой (строка - отметка времени начала процесса) и числовой информации (счетчики событий) на случай перезапуска программы.
Так вот вынужден констатировать: глобальные переменные живут своей жизнью, причем живут весело и задорно.

Может есть какие-то особенности при использовании глобальных переменных, что-то вроде:
- нельзя использовать строковые и числовые переменные "вперемешку";
- есть ограничение на имена глобальных переменных;
- есть ограничения в количестве глобальных переменных;
- физически на диск информация записывается при определенных условиях;
- нельзя использовать сравнение "==", а необходимо использовать только ">" или "<"
и т.д.

Ранее использовал запись в текстовый файл отметок о старте процесса.
И всё работало как часы.
Теперь же решил идти в ногу с прогрессом - перейти на глобальные переменные - и уже не раз пожалел об этом. :(

Анатолий, если не сложно можете подробно описать проблемы с глобальными переменными, при каких условиях возникают проблемы с этими переменными. Если сможете то пришлите на simp@miniscada.com текст Ваших скриптов где применяются глобальные переменные.
Avatar
Добрый день!

Вынужден вновь вернуться к вопросу о глобальных переменных.
Не получается у нас с ними мирного существования.
Я использую глобальные переменные для сохранения строковой (строка - отметка времени начала процесса) и числовой информации (счетчики событий) на случай перезапуска программы.
Так вот вынужден констатировать: глобальные переменные живут своей жизнью, причем живут весело и задорно.

Может есть какие-то особенности при использовании глобальных переменных, что-то вроде:
- нельзя использовать строковые и числовые переменные "вперемешку";
- есть ограничение на имена глобальных переменных;
- есть ограничения в количестве глобальных переменных;
- физически на диск информация записывается при определенных условиях;
- нельзя использовать сравнение "==", а необходимо использовать только ">" или "<"
и т.д.

Ранее использовал запись в текстовый файл отметок о старте процесса.
И всё работало как часы.
Теперь же решил идти в ногу с прогрессом - перейти на глобальные переменные - и уже не раз пожалел об этом. :(

С уважением, Кондратенко Анатолий
Новочеркасск
Avatar
SIMP Tech (Сергей)
Добрый день, Анатолий.

Занялся ревизией скриптов в свете последних изменений и дополнений в функциональность системы SimpLight.
И столкнулся с загадкой, разгадать которую не могу - прошу помощи.
Речь идет о глобальных переменных.
Ведь при старте программы в конструкции if(AsFirstRun){…} происходит объявление глобальной переменной, где ей присваивается начальное значение. Получается, что глобальная переменная получит начальное значение, и "забудет" то значение, которое содержало до выключения программы.

Я бы попробовал сделать следующим образом, внутри AsFirstRun запросить переменную из кэша GetGlobalVar если переменная уже есть в кэше, т.е. она ранше уже создавалась и имеет какое то значение, то функция вернёт число отличное от нуля, если переменной в кэше нет то функция вернёт 0. Т.е. при AsFirstRun сначало можно запросить глобальную переменную из кэша, и на основе результата принять решение как инициализировать переменную.