powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка при работе с потоками в DLL
8 сообщений из 33, страница 2 из 2
Ошибка при работе с потоками в DLL
    #40069557
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLL экспортирует функцию SetCallback, через которую устанавливается обработчик в основном модуле. Из этого обработчика через Synchronize обновляются контролы.
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40069559
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov

через Synchronize обновляются контролы


Спасибо за подсказку

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

В данном случае речь идет об УЖЕ законченном потоке и уничтожении объектов в момент
высвобождении памяти FreeLibrary.
Такое впечатление что система зафиксировала объекты с которыми работала в DLL (не только
созданными) и Destro-т их.
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40069570
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchronize необходимо применять всегда, когда неосновной поток должен взаимодействовать с визуальными VCL контролами. DLL в свою очередь не должна ничего знать о визуальных контролах (особенно, если она предназначена для использования из программ, написанных не на Delphi). К DLL вообще нежелательно подключать какие-либо модули VCL.
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40069648
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov

К DLL вообще нежелательно подключать какие-либо модули VCL.

Как например - вывести промежуточные результаты ?
Если Вы примените Synchronize в цикле потока Вы нивелируете эффект потока и
основная форма будет блокирована. По крайней мере у меня такой эффект.
Хотел бы иметь "живую" форму и явно блокирую только кнопку выполнения.
Synchronize- можно применить по результатам отдельных этапов выполнения задач.

Но основной вопрос не в этом - эффект без Synchronize, меня устраивает
(попробую в конце потока может поможет....)

"В данном случае речь идет об УЖЕ законченном потоке и уничтожении объектов в момент
высвобождении памяти FreeLibrary.
Такое впечатление что система зафиксировала объекты с которыми работала в DLL (не только
созданными) и Destro-т их."
Может как-то указатель передать - и обнулить его до освобождения памяти ?

Спасибо за обсуждение
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40069677
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Как например - вывести промежуточные результаты ?
Если Вы примените Synchronize в цикле потока Вы нивелируете эффект потока и
основная форма будет блокирована.

С какого перепугу? Обновиться индикатор где-нибудь в строке состояния и все. Главное - не обновлять слишком часто, чтобы накладные расходы на прогресс индикатор не превысили собственно расчет. Раз в секунду - и нормально.

В ваш код не вникал, как тут уже писали - там все плохо. Вот переделаете как я сказал - тогда и проблемы исчезнут.
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40070171
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
axim Rusov,

Сменил объект визуализации вместо TStatusPanel просто TPanel
Все заработало без проблем и без общей смены архитектуры библиотеки и объектов.

Повторюсь у меня на это DLL и с TStatusPanel в основной форме, достаточно много
приложений нормально и долго РАБОТАЕТ !!!
Тут маленькая форма из двух циклов заняла 4 дня траханины.

Это даже не секс - это некая 64 bit ...ОПА.

Насчет замечаний - принято, полагаю еще буду вопрошать

Всем спасибо за участие и вопросы
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40070208
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

ЧИТД. У вас где-то проблема с памятью. Т.е. при уничтожении dll она подчищает за собой память и очищает память, которая используется в основном модуле. Сменив тип объекта вы изменили и занятую память так, что в данный момент dll перестала залазить на чужую память.
...
Рейтинг: 0 / 0
Ошибка при работе с потоками в DLL
    #40070242
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
В момент закрытие библиотеки DLL после выполнения всего процесса FreeLibrary(LibHandle);

Безотносительно прочего и ошибки, в которой таки стоит разобраться, пока она не стрельнула иначе где-нибудь ещё - я не понимаю, откуда и зачем у людей странное стремление выгружать DLL посреди работы. Для чего, только для того, чтобы чуть позже пользователь тратил дополнительное время, ожидая повторной загрузки? Лично я знаю две разумных причины для такой выгрузки:

1. Обновление (смена версии dll)
2. Во время отладки вносить изменения в dll, не перезапуская exe

HOME_X
и сообщения о статусе выполнения работ передается в основную форму
TStatusBar.Panels[1].Text:='Work/Closed и т.д.'

Это архитектурная ошибка, которую стоит исправить. Потоку незачем знать о каких-то статуспанелях. Его дело - отрапортовать о своём состоянии (главной форме или отдельному объекту). А уж тот пусть решает, вывести ли это текстом в статусбар, какой-нибудь иконкой или вообще забить. Это не вопрос потока.
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка при работе с потоками в DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]