Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2014, 02:25   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Потоки внутри DLL

Доброго времени!

Есть некая DLL которая имеет примерно такую структуру:
Код:
var
 CritSect:TCriticalSection;
 aObjects:array of TWorkObject;


TSomeExternalClass.GetObject(...):IWorkObject;
var
 i, ...
begin
 CritSect.Enter;
 try
   ...
   Result := aObject[i];
...
 finally
    CritSect.Leave;
 end;
end;

TWorkObject.DoMonkeysJob;
begin
 while true do
....
end;
Как видно из кода, потоков нет.
Есть глобальные крит. секция и есть массив объектов.

GetObject внешнего класса(его дергает приложение вызывающее DLL), возвращает из массива объект, крит. секция блокирует доступ к GetObject пока эта функция занята в другом потоке внешнего приложения, т.е. нельзя чтобы чего-то два штуки получили один TWorkObject.

Но дилема в другом, приложение подвисает целиком на 700 мс - 2 сек.(в его контекст загружена DLL) что создает очень большие проблемы, т.к. нагрузка большая и работа тоже не маленькая, которую кстати и выполняет эта библиотека(пара тысяч единиц данных в секунду).
Подвисает при условии что, в массиве минимум 6 объектов свободны, и проблем особо с получением объекта нет.

Итого наблюдаю задержку от 700 мс до 2-5 сек. Иногда вообще ступор и все висит минут 5(это уже ПИ***Ц).

И вот вопрос:
Решится ли проблема зависания основного потока с DLL если каждый TWorkObject будет отдельным потоком внутри DLL для выполнения тяжелых под-задач?
Человек_Борща вне форума Ответить с цитированием
Старый 18.09.2014, 08:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Решится ли проблема зависания основного потока с DLL если каждый TWorkObject будет отдельным потоком внутри DLL для выполнения тяжелых под-задач?
По идее должна решиться. Вот только критическую секцию нужно как-то уменьшить.
А вообще я бы создал конкретно для этой цели отдельный экзешник. Вопрос конечно в том что передавать и как, если это объект то пичаль, а если простые данные то ИМХО так будет проще.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2014, 08:23   #3
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

По идее нет. Потоку, работающему с dll так и так придётся ждать выполнение работы внутри библиотеки. Соответственно поток будет висеть. Выход - доп поток в основном коде, или как вариант, попытка синхронизации dll с программой.
indexx вне форума Ответить с цитированием
Старый 18.09.2014, 09:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Соответственно поток будет висеть.
Я ошибаюсь или автору нужно разгрузить основной поток?
Тогда не понимаю твоей мысли: в ДЛЛ организовывается поток, который не мешает другим что-то делать параллельно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2014, 10:05   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

из кода не видно, что именно вешает программу.
процедура получения объекта или все же процедура в объекте.

потоков тут вообще не наблюдаю.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2014, 10:21   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
По идее должна решиться. Вот только критическую секцию нужно как-то уменьшить.
Он и так маленький. Внутри стоит for по массиву с кучей проверок самого массива(больше их ставить просто негде).

Цитата:
А вообще я бы создал конкретно для этой цели отдельный экзешник. Вопрос конечно в том что передавать и как, если это объект то пичаль, а если простые данные то ИМХО так будет проще.
Отдельный exe врядли.
Возвращается интерфейс объекта для работы с ним.

Цитата:
Тогда не понимаю твоей мысли: в ДЛЛ организовывается поток, который не мешает другим что-то делать параллельно.
исхожу из того, что в библиотеке сейчас нет доп. потоков. Грузится она в основной exe, а работают с ней в других доп. потоках основной программы. Получается, когда 1 из этих потоков делает тяжелую задачу, осн. приложение тупо зависает.

Мне нужно это убрать вместе с замиранием доп-потоков

Цитата:
из кода не видно, что именно вешает программу.
процедура получения объекта или все же процедура в объекте.
Если быбыло видно, я бы тему не создавал Таких процедур там минимум 10.

Цитата:
потоков тут вообще не наблюдаю.
Они у основной программы, цепляют функции DLL.
Человек_Борща вне форума Ответить с цитированием
Старый 18.09.2014, 12:06   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

в общем, нужно ли программе результат этих функций.

PS: для отладки могли и выкинуть лишний тяжелый код на время, чтоб определить где виснет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 18.09.2014 в 12:10.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2014, 12:25   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

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

Из отладки у меня только несколько гб логов

Если объекты превратить в потоки с этими объектами, решит ли это проблему?
Человек_Борща вне форума Ответить с цитированием
Старый 18.09.2014, 12:39   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а что методам запрещают возвращать результат?

программе нужен результат выполнения? или она их дергает с темой "а пусть само работает"
если второе то проблем нет.
в первом случае ничего не меняется, ибо программа будет ждать результат все равно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Как подружить TwebBrowser, DLL и потоки??? d@lphi Общие вопросы Delphi 3 10.03.2012 21:09
bass.dll и mms потоки vismut Мультимедиа в Delphi 8 07.10.2011 19:01
WPF, DLL и потоки... Namolem WPF, UWP, WinRT, XAML 3 22.11.2010 22:54
DLL, потоки BOBAH13 Общие вопросы Delphi 23 27.02.2008 20:43