У вас не стоит Flash Player
Настройки
#62815 - Thu Jun 26 2014 11:26 AM Проблемы со статикой
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Прошу подсказать, может кто-то сталкивался.
Скрипты на онлайне, которые используют статические поля периодически выдают левые данные. На истории все всегда в порядке. По всей видимости значения статпеременных самопроизвольно сбрасываются или переписываются. С чем это связано? Нехватка оперативки? Что с этим можно сделать?
PS Все поля private.

Наверх
#62820 - Thu Jun 26 2014 12:45 PM Re: Проблемы со статикой [Re: Kermit]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: Kermit
Прошу подсказать, может кто-то сталкивался.
Скрипты на онлайне, которые используют статические поля периодически выдают левые данные. На истории все всегда в порядке. По всей видимости значения статпеременных самопроизвольно сбрасываются или переписываются. С чем это связано? Нехватка оперативки? Что с этим можно сделать?
PS Все поля private.

А вы понимаете что такое статическое поле? И как оно работает? Предлагаю вникнуть в сей вопрос и изложить кратко здесь.
_________________________
__


Наверх
#62825 - Thu Jun 26 2014 01:16 PM Re: Проблемы со статикой [Re: ra81]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Ок. Начнем издалека.)))
Статическое поле принадлежит классу, а не объекту класса. Создается статическим конструктором один раз и является общим для всех экземпляров класса. Применительно к ТСЛАБ. Когда исполняется Executive новый объект статического поля не создается. Это позволяет сохранять данные между пересчетами скрипта.

Наверх
#62827 - Thu Jun 26 2014 01:57 PM Re: Проблемы со статикой [Re: Kermit]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Чудес не бывает, если значение изменяется, то значит "кто-то" его изменил. Проверяйте логику обновления этих полей. Также, все усложняется из-за многопоточности исполнения скриптов лабой.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#62829 - Thu Jun 26 2014 02:16 PM Re: Проблемы со статикой [Re: jhgjrht]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Я предполагаю, что если есть ошибки в логике, то они есть всегда. Т.е. ошибка бы проявлялась бы постоянно. А не время от времени и сама бы пропадала иногда.

Наверх
#62832 - Thu Jun 26 2014 02:21 PM Re: Проблемы со статикой [Re: Kermit]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Два параллельно исполняющихся скрипта запросто могут ИНОГДА конкурировать за значение в одной ячейке памяти.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#62834 - Thu Jun 26 2014 02:30 PM Re: Проблемы со статикой [Re: jhgjrht]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
У меня вот аналогичная версия происходящего. Как это можно проверить/исправить?

Наверх
#62835 - Thu Jun 26 2014 02:37 PM Re: Проблемы со статикой [Re: Kermit]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Традиционный способ поиска проблемы в многопоточном приложении - это вести лог событий. Т.е. в вашем случае, писать в лог каждый раз, когда изменяете значение переменной.
А можете тупо (или не тупо) временно блокировать доступ к переменной на время работы скрипта. См. документацию по C# оператор lock
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#62841 - Thu Jun 26 2014 03:54 PM Re: Проблемы со статикой [Re: jhgjrht]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: jhgjrht
Два параллельно исполняющихся скрипта запросто могут ИНОГДА конкурировать за значение в одной ячейке памяти.

Вот вам и ответ на вопрос в топе. Две копии скрипта и одно статическое поле. Труляля имеем трабл.

А то что писалось про lock уже ошибочно. Это не нужно. Просто помните что статическое поле у вас ОДНО на ВСЕ копии скрипта.
_________________________
__


Наверх
#62846 - Thu Jun 26 2014 04:39 PM Re: Проблемы со статикой [Re: ra81]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Можно попросить раскрыть идею начет копии скрипта? Уже не помню где, по моему на форуме, читал что у ТСЛАБ отдельный поток на каждый исполняемый скрипт.
Тогда, по идее, с одним потоком блокировки не нужны.


Отредактировано Kermit (Thu Jun 26 2014 04:46 PM)
Edit Reason: add

Наверх
#62855 - Thu Jun 26 2014 07:33 PM Re: Проблемы со статикой [Re: Kermit]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: Kermit
Можно попросить раскрыть идею начет копии скрипта? Уже не помню где, по моему на форуме, читал что у ТСЛАБ отдельный поток на каждый исполняемый скрипт.
Тогда, по идее, с одним потоком блокировки не нужны.

блокировки не нужны. Тут дезинформация. Блокировки не помогут вообще в проблеме со статическим полем.

Тут у вас проблема понимания сути статического поля. Все ваши скрипты будут разделять ОДНО поле. Оно будет ОБЩИМ. В этом суть статических членов класса. Значит все скрипты будут друг другу мешать запихивая в это поле каждый раз свое значение.

Я раньше на уроках про статик поля рассказывал но перестал именно из за возможных проблем с ним. используйте кэш скриптов. все подробно расписано на нашем сайте. почитайте.
_________________________
__


Наверх
#62856 - Thu Jun 26 2014 07:54 PM Re: Проблемы со статикой [Re: ra81]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Так поле объявлено в конкретном классе. Почему оно общее?

Наверх
#62857 - Thu Jun 26 2014 08:23 PM Re: Проблемы со статикой [Re: Kermit]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: Kermit
Так поле объявлено в конкретном классе. Почему оно общее?

Скрипт есть экземпляр класса. Две копии скрипта есть два экземпляра класса. Почему для двух экземпляров одно поле? Тут отправляю к документации по статическим членам класса.
_________________________
__


Наверх
#62858 - Thu Jun 26 2014 08:46 PM Re: Проблемы со статикой [Re: ra81]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Мда, забавно.
Про использование lock у меня все правильно написано. Ни ошибок, ни дезинформации нет. Вопрос только где и как блокировку использовать.

А вот про то, что статическое поле одно на все скрипты, это вы ошибаетесь. Лаба каждый скрипт, и даже копии одного и того же скрипта, загружает и выполняет как отдельную самостоятельную сборку. Т.е. создает в памяти копии кода скрипта в виде отдельных сборок. Соответственно и статических переменных, определенных в скрипте, в памяти будет столько, сколько копий скрипта запущено. Т.е. каждый скрипт будет использовать свое статическое поле.
Это что касается статических переменных в теле скрипта. А в случае нахождения статического поля в сборке с индикаторами, загружаемыми лабой при ее старте, все скрипты, использующие это поле, будут обращаться к одному и тому же полю (ячейке памяти). Тогда разные скрипты могут одновременно обновлять это поле и, соответственно, ВОЗМОЖНО, нужна его блокировка.
Между пересчетами, значение статического поля не меняется, но стоит вам перезапустить скрипт, как использоваться будет уже другая сборка и другое поле и ранее сохраненные в него значения будут недоступны.

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

Приведите код своего скрипта, использующего статическую переменную. Удалите все, что ненужно (суть стратегии), но оставьте пример, как вы используете эту переменную, посмотрим.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#62863 - Thu Jun 26 2014 10:37 PM Re: Проблемы со статикой [Re: jhgjrht]
Kermit Offline
enthusiast

Registered: Wed Jan 18 2012
Записи: 256
Проблемные поля в кубике индикатора. Используются для сохранения исторических данных в кубике с последовательной обработкой. Кстати только задумался, что на скриптах никогда не сталкивался с такими проблемами.

Наверх
#62865 - Thu Jun 26 2014 11:40 PM Re: Проблемы со статикой [Re: Kermit]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Трудно посоветовать что-либо еще.
Мне кажется, надо проверять логику использования статпеременной или пытаться пропускать некорректные значение в индикаторе, если такое возможно.

Индикатор с последовательной обработкой все усложняет, даже блокировать доступ других скриптов к статпеременной в таком индикаторе не получится. Может лучше сделать индикатор с потоковой обработкой (который рассчитывается в начале пересчета скрипта)? А для последовательной обработки (в цикле по свечкам) использовать обновляемое значение или другой индикатор инициализируемый значением из первого.

Может быть в лаборатории открыт и "обновляется в реальном времени" скрипт который тоже использует этот индикатор?
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#62876 - Fri Jun 27 2014 07:47 AM Re: Проблемы со статикой [Re: jhgjrht]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
Originally Posted By: jhgjrht
Мда, забавно.
Про использование lock у меня все правильно написано. Ни ошибок, ни дезинформации нет. Вопрос только где и как блокировку использовать.

Чем поможет лок в проблеме когда у человека одно поле разделяется несколькими скриптами? Лок может помочь только избежать ошибок совместного доступа и все. Но никак не избавит от самого факта этого доступа.

Originally Posted By: jhgjrht

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

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


ПС: просто не нужно использовать стат полей и все. Ищите другие подходы, более стандартные для тслаба.


Отредактировано ra81 (Fri Jun 27 2014 07:47 AM)
_________________________
__


Наверх


Moderator:  ViL, sar