Кто сталкивался с такой проблемой, используя свой DLL

 

Написал dll библиотеку.

Туда отправляю котировки разных периодов. Получаю линии, которые рисую.

Все прекрасно работает на одном окне.

Когда вешаю советник, который использует библиотеку, на несколько окон, то вешается терминал.

Когда пытаюсь исполнить скрипт на нескольких окнах одновременно - вешается терминал, причем вешает тот скрипт, что был вызван первым.

Такое ощущение, что последующие вызовы библиотеки вешают предыдущие(которые еще работают), но так же быть не должно?

 
представьте если 10 человек пытаются влезь в 1 туалет.
 
Vladon:
представьте если 10 человек пытаются влезь в 1 туалет.


проблем с вызовом dll не должно быть, т.к. dll занимается ОС (Windows) - сколько бы прогрмамм не вызывало dll, ОС загрузит один сегмент кода dll и каждому приложению вызвавшему dll будет создан собственный экземпляр переменных http://msdn.microsoft.com/ru-ru/library/h90dkhs0(VS.90).aspx

другой вопрос, что приложение которое вызывает dll это один и тот же процесс - терминал МТ4,

если в dll сложные расчеты, требующие времени попробуйте после вызова dll делать в советнике паузу (Sleep(1000)), чтобы дать доступ работе терминала и других советников/индикаторов

возможно топикстартер вызывает  dll каждый тик, что и приводит к зависанию терминала когда плотность тиков большая (тики от 4 шт/сек до 70-80шт/сек)

 
Vladon:
представьте если 10 человек пытаются влезь в 1 туалет.


Да, понял.

Проблема с многопоточностью, насколько я понял. В библиотеке создаются много векторов, часть из них переписывается, когда происходит новый вызов.

Буду использовать mutex и lock, надеюсь поможет ;)

 
IgorM:


проблем с вызовом dll не должно быть, т.к. dll занимается ОС (Windows) - сколько бы прогрмамм не вызывало dll, ОС загрузит один сегмент кода dll и каждому приложению вызвавшему dll будет создан собственный экземпляр переменных http://msdn.microsoft.com/ru-ru/library/h90dkhs0(VS.90).aspx

другой вопрос, что приложение которое вызывает dll это один и тот же процесс - терминал МТ4,

если в dll сложные расчеты, требующие времени попробуйте после вызова dll делать в советнике паузу (Sleep(1000)), чтобы дать доступ работе терминала и других советников/индикаторов

возможно топикстартер вызывает dll каждый тик, что и приводит к зависанию терминала когда плотность тиков большая (тики от 4 шт/сек до 70-80шт/сек)



Я думал, что по идее так и должно быть. Но, нет пути.

Странно все это. Когда написал первую версию библиотеки, она работала как часы (может была быстрая). Сейчас же, смотрю и вижу что размер вектора из первого обращения изменяется при обращении из другого окна.

 
isabek:


Я думал, что по идее так и должно быть. Но, нет пути.

Странно все это. Когда написал первую версию библиотеки, она работала как часы (может была быстрая). Сейчас же, смотрю и вижу что размер вектора из первого обращения изменяется при обращении из другого окна.


ну а как Вы хотите? у Вас же приложение вызвавшее dll одно и то же - терминал МТ4, вот, возможно, из одного советника дали данные в dll, а в другой получили

передавайте магик/symbol и т.п. в dll, не забывайте в dll инициализировать ВСЕ переменные (возможно старые данные сохраняете если они глобальные переменные в dll) да и попробуйте вызвать по закрывшемуся бару если возможно 

 
IgorM:


ну а как Вы хотите? у Вас же приложение вызвавшее dll одно и то же - терминал МТ4, вот, возможно, из одного советника дали данные в dll, а в другой получили

передавайте магик/symbol и т.п. в dll, не забывайте в dll инициализировать ВСЕ переменные (возможно старые данные сохраняете если они глобальные переменные в dll) да и попробуйте вызвать по закрывшемуся бару если возможно

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

Инициализирую все, обнуляю, передаю только по закрывшемуся бару. Передаю символ и период.

 
не знаю даже, что предложить - как вариант попробуйте пока сделать себе копии dll по числу советников, dll переименуйте все(myfunc01.dll,myfunc02.dll,....) и потестите - есть ли такой баг если вызов разных советников с разных dll (если переименуете, то для ОС это разные dll) и приводит ли этот баг к подвисанию терминала - если нет, то значит проблема в dll, если да - проблема в терминале
 
Vladon:
представьте если 10 человек пытаются влезь в 1 туалет.


Пример не совсем точный.

2 isabek

Представьте два человека-невидимки держат в руках по горсти песка. У одного красный песок, а у другого-желтый. Друг друга они не видят, но зато видят чашку. Она у них общая. Первый высыпал свой песок в чашку. Второй этого не видел и тоже высыпал свой песок вслед за первым. Тут первый решил проверить сколько песка в чашке и заглянул в нее. И тут он увидел желтый песок в чашке вместо красного.

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

 

Я это решил через вектор классов. На каждое окно свой класс. Идентификатор - дескриптор окна.

Надо будет к вектору классов написать класс-менеджер вектора классов, чтобы они сильно не плодились.

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

 

api, Zhunko, благодарю - об этом что-то не догадался.

Причина обращения: