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

 

Ага. Прав Вадим. 

Завести, если С++, то std::map<Идентификатор Окна, Инстанс Класса С Данными> - и все.

У меня оно же всегда выглядит как  std::map<Идентификатор Окна, Shared Pointer <Класс С Данными> >.

Синхронизация только при поиске (добавлении- удалении) новых индикаторов в этот самый мап. 

 

может разработчики выскажутся по этому поводу?

 
isabek:

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

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

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

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

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

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


У вас используются глобальные переменные? Если да, то может просто не делайте этого? Функции в библиотеке поменьше делать и переменные не держать в ДЛЛ?
 
Choomazik:

У вас используются глобальные переменные? Если да, то может просто не делайте этого? Функции в библиотеке поменьше делать и переменные не держать в ДЛЛ?


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

Хотя самый легкий способ это :) переименовать-создать много библиотек и советников :) ужас. Зато больше не будет проблем.

 
isabek:


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

Хотя самый легкий способ это :) переименовать-создать много библиотек и советников :) ужас. Зато больше не будет проблем.

На каком языке пишите? Например, если на C++, то я не могу себе представить, чтобы человек мог отказаться от структур и классов, а также многообразия контейнеров STL.
 
jartmailru:
На каком языке пишите? Например, если на C++, то я не могу себе представить, чтобы человек мог отказаться от структур и классов, а также многообразия контейнеров STL.
какое отношение имеют глобальные переменные к классам и STL? :)
 

Choomazik:
  какое отношение имеют глобальные переменные к классам и STL? :) 


Если есть возможность хранить данные в Dll и делать это удобно- зачем отказываться от этой возможности? Цена вопроса- освоить критическую секцию, std::map и shared pointer (необязательно, но очень приятственно). Нам дают ArrayCopyRates()- дешёвый способ перегнать все данные в Dll. 

.

А что до глобальных переменных- например, я завожу в Dll глобальные переменные

namespace { 

Utils::CCriticalSection gs_cs; 

std::map<WindowHandle, SharedPtr<DataEntity> > gs_myData

}

и функцию типа

SharedPtr<DataEntity> Find(WindowHandle handle) {

Utils::CLock l(gs_cs);

...... поиск или создание - 4 строки

 
jartmailru:

Если есть возможность хранить данные в Dll и делать это удобно- зачем отказываться от этой возможности? Цена вопроса- освоить критическую секцию, std::map и shared pointer (необязательно, но очень приятственно). Нам дают ArrayCopyRates()- дешёвый способ перегнать все данные в Dll.

...

Много слов, суть - вы смешиваете совершенно разные концепты в одну кучу: классы, критические секции, STL. То что они вам нравятся - не аргумент для их обязательного совместного использования :)
 
Choomazik:
Много слов, суть - вы смешиваете совершенно разные концепты в одну кучу: классы, критические секции, STL. То что они вам нравятся - не аргумент для их обязательного совместного использования :)
Андрей пытается донести, что С++ с STL даёт возможность удобно использовать глобальную область библиотеки без смешивания данных. Раздельно на каждую сущность.
 

Кстати, есть же еще стандартный способ использования API. Вызываем функцию Init() она возвращает

нам хэндл (просто число), который является индексом в глобальном массиве объектов.

Тогда можно даже в одном окне запускать индикаторов столько, сколько нужно.

Привязка к идентификатору окна необязательна. 

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