Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Доброго дня господа ! Delphi 10.3.3 64xbit Имею архитектуру - исполняемый модуль 64 bit в нем TStatusBar с набором панелей. - модуль библиотеки DLL 64 bit здесь в потоке выполняется запрос и сообщения о статусе выполнения работ передается в основную форму TStatusBar.Panels[1].Text:='Work/Closed и т.д.' В момент закрытие библиотеки DLL после выполнения всего процесса FreeLibrary(LibHandle); Наблюдаю потерю указателе ИЛИ обнуливание семейства Panels кодом это выглядит так Запуск Код: pascal 1. 2. 3. 4. 5. 6. Завершение потока по событию - передача события в основную форму Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Ошибку наблюдаю в момент закрытия основного окна - когда идет destroy все обьектов Вот такая ситуация - помогите если сталкивались P. S . - если в DLL не передавать параметр на визуализацию статусов ovMes if(@Create_AddSpan<>nil)then Thread:=Create_AddSpan(pFile,pList,aKind,ovBar, ovMes ,frMain.Handle,ovSql,ovRecordSet); Ошибки не происходит Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:21 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X, cкорее всего обычная заморочка с со скрытыми ссылками. Если библиотеке есть функции, возвращающие интерфейсы, оберни их вызов в процедуры с out-параметрами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:29 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис HOME_X, cкорее всего обычная заморочка с со скрытыми ссылками. Если библиотеке есть функции, возвращающие интерфейсы, оберни их вызов в процедуры с out-параметрами. Это простой набор OveVariant параметров Библиотека Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Вызов из основного окна Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Не могли бы уточнить на примере - как реализовать Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:38 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_XpFile:=PAnsiChar(AnsiString(aFile)); А вот за такое отрывают руки. Хотя вменяемые компиляторы сами ругаются о получении указателя на временный объект. К моменту вызова Create_AddSpan этот указатель уже становится инвалидным и указывает на мусор. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:41 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
[quot HOME_X#22320390] Соколинский Борис function Create_AddSpan(aFile: PAnsiChar; aList: PAnsiChar; aKind: OleVariant; aBars: OleVariant; VAR aMess: OleVariant; aHandle: OleVariant; var aSql: OleVariant; var aRecordSet: OleVariant): Integer; Типа так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:45 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov HOME_XpFile:=PAnsiChar(AnsiString(aFile)); А вот за такое отрывают руки. Хотя вменяемые компиляторы сами ругаются о получении указателя на временный объект. К моменту вызова Create_AddSpan этот указатель уже становится инвалидным и указывает на мусор. Работает - нормально и долго !!!! Предлагаете реализовать через поле объекта ? Нет вопросов - учту - спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:49 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_XРаботает - нормально и долго !!!! "Дуракам везёт." Я предлагаю передавать в функцию валидный указатель и прочитать теорию о времени жизни переменных. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:50 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov HOME_XРаботает - нормально и долго !!!! "Дуракам везёт." Если бы на деньги ... А по сути темы, что - то подскажите ? Как устранить ошибку с указателями ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 12:57 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. - для 64-х битных указателей так делать нельзя. Используйте для этого UIntPtr http://docwiki.embarcadero.com/Libraries/Sydney/en/System.UIntPtr И зачем вы указатели ещё в OleVarian оборачиваете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:02 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Почитать теорию о времени жизни переменных и работе с памятью. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:03 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
zedxxx Код: pascal 1. - для 64-х битных указателей так делать нельзя. Используйте для этого UIntPtr http://docwiki.embarcadero.com/Libraries/Sydney/en/System.UIntPtr И зачем вы указатели ещё в OleVarian оборачиваете? "..64-х битных указателей.." Принято - это был переход с 32- bit версии ! "..OleVariant .." DLL - используется НЕ ТОЛЬКО Delphi а еще из VBA и COM- серверами системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:08 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X исполняемый модуль 64 bit HOME_X Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:18 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X, Модератор: Аккуратнее с названиями топиков и лексикой, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:31 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ HOME_X исполняемый модуль 64 bit HOME_X Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 13:39 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Почитать теорию о времени жизни переменных и работе с памятью. а где такое расписано для двоечников? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 15:29 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
cptngrbа где такое расписано для двоечников? В букваре?.. https://learndelphi.org/resources/программирование-на-delphi-для-школ/ Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 15:38 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, там такого не пишут. вот тут немножко https://www.rsdn.org/article/Delphi/memmanager.xml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 16:37 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
cptngrbтам такого не пишут. А зря. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 17:58 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Букварь о разработке своей DLL для двоечников. По сути вопроса - при выгрузке DLL освобождается вся её память. Соответственно, если вы из DLL выделили память (читай: объекты, интерфейсы и т.п.) и передали куда-то, то этой памяти будет капут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 18:01 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Давно читал эту классную статью. В своих проектах очень много используется PAnsiChar и все что с ним связано, после прочтения WideString )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 18:05 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
GunSmokerпри выгрузке DLL освобождается вся её память. Нет, не вся. Только та, что выделилась при загрузке. И та, которую код этой DLL соизволит освободить при выгрузке. Что, впрочем, у стандартного дельфийского менеджера - вся его куча. Но у ТС-а и с локальными переменными-то беда, не то что с возвратом. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 18:07 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ HOME_X исполняемый модуль 64 bit HOME_X Код: pascal 1. ovMes:=OleVariant(Integer(sbMain)); Мне необходимо вызывать функцию DLL из под MS Office и Delphi, других совместимых и работающих типов не нашел (в свое время искал и пробывал) Это " Р А Б О Т А Е Т !!! " (может "дуракам везет" - смотри замечание выше) Если подскажите как совместить - уточню задачу четко и конкретно ! P.S. Насчет Integer - согласен остатки 32 bit версии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2021, 23:55 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov GunSmokerпри выгрузке DLL освобождается вся её память. Нет, не вся. Только та, что выделилась при загрузке. И та, которую код этой DLL соизволит освободить при выгрузке. Что, впрочем, у стандартного дельфийского менеджера - вся его куча. Но у ТС-а и с локальными переменными-то беда, не то что с возвратом. Насчет памяти, которая была выделена в момент загрузке вопрос абсолютно ясен Как понять "DLL соизволил" ? Передаваемая память принадлежит другому процессу Она создана другим процессом и инициализирована другим процессом. и явной команды на удаление этой памяти нет. Суть в том, что на данной DLL и на данной схеме подключения у меня работает на менее 15-20 приложений и вопросов не возникало. (от слова совсем) Замечу, что по такой же схеме реализован код if (aBars <>Null)then B:=TProgressBar(Integer(aBars)) else B:=Nil; Это прогресс бар на моменты импорта данных из запроса Все абсолютно идентично. передача данных , изменение их состояния.... Тема "дуракам везет слишком часто" в большой статистике не прокатывает. Возможно я что-то упустил, например моменты потоковой и "сплошной" инициализации данных ? Как выйти из положения имея в основе выше указанный код, приведите пример пожалуйста. Благодарен за Ваше участие и обсуждение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 00:19 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
У вас настолько лютый треш написан, что никто в это говно (уж извините) погружаться не хочет. Тем более, что много важных деталей вы не упоминаете вообще, видимо, не понимая их важности. А клещами тащить их из вас, да ещё и объяснять что к чему... Но вот быстрый способ: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Ну, типа, запускаете приложение, выходите, и смотрите в какой момент срабатывает бряк. По Call Stack смотрите кто и откуда его дёргает. Если проблема не в этом, то - ой. Значит, всё же проблема с памятью. Тогда надо весь код пересматривать/переделывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 09:03 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
GunSmoker Значит, всё же проблема с памятью. Это проблема с памятью вызванная FreeLibrary(LibHandle) Ссылок на TStatusBar в основном потоке нет (сейчас еще проведу пару тестов) Как бы Вы решили данную задачу основной поток - здесь TProgressBar и TStatusBar DLL библиотека - здесь создается объект и один из его методов работает в потоке, где организован цикл по TQuery (или просто цикл) и вывод промежуточных результатов выполнения на вышеупом-е объекты Передача параметров в DLL типах OleVariant (DLL используется НЕ ТОЛЬКО Delphi) Буду весьма признателен за пример в коде Спасибо за общение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 10:29 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
DLL экспортирует функцию SetCallback, через которую устанавливается обработчик в основном модуле. Из этого обработчика через Synchronize обновляются контролы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 10:57 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov через Synchronize обновляются контролы Спасибо за подсказку Synchronize - эффектно применять при поэтапном выполнении процесса, если возникает необходимость в допуске к данному ресурсу(переменной) нескольким сторонним процессам. В данном случае речь идет об УЖЕ законченном потоке и уничтожении объектов в момент высвобождении памяти FreeLibrary. Такое впечатление что система зафиксировала объекты с которыми работала в DLL (не только созданными) и Destro-т их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 11:11 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Synchronize необходимо применять всегда, когда неосновной поток должен взаимодействовать с визуальными VCL контролами. DLL в свою очередь не должна ничего знать о визуальных контролах (особенно, если она предназначена для использования из программ, написанных не на Delphi). К DLL вообще нежелательно подключать какие-либо модули VCL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 11:43 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov К DLL вообще нежелательно подключать какие-либо модули VCL. Как например - вывести промежуточные результаты ? Если Вы примените Synchronize в цикле потока Вы нивелируете эффект потока и основная форма будет блокирована. По крайней мере у меня такой эффект. Хотел бы иметь "живую" форму и явно блокирую только кнопку выполнения. Synchronize- можно применить по результатам отдельных этапов выполнения задач. Но основной вопрос не в этом - эффект без Synchronize, меня устраивает (попробую в конце потока может поможет....) "В данном случае речь идет об УЖЕ законченном потоке и уничтожении объектов в момент высвобождении памяти FreeLibrary. Такое впечатление что система зафиксировала объекты с которыми работала в DLL (не только созданными) и Destro-т их." Может как-то указатель передать - и обнулить его до освобождения памяти ? Спасибо за обсуждение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 15:12 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X Как например - вывести промежуточные результаты ? Если Вы примените Synchronize в цикле потока Вы нивелируете эффект потока и основная форма будет блокирована. С какого перепугу? Обновиться индикатор где-нибудь в строке состояния и все. Главное - не обновлять слишком часто, чтобы накладные расходы на прогресс индикатор не превысили собственно расчет. Раз в секунду - и нормально. В ваш код не вникал, как тут уже писали - там все плохо. Вот переделаете как я сказал - тогда и проблемы исчезнут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2021, 15:59 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
axim Rusov, Сменил объект визуализации вместо TStatusPanel просто TPanel Все заработало без проблем и без общей смены архитектуры библиотеки и объектов. Повторюсь у меня на это DLL и с TStatusPanel в основной форме, достаточно много приложений нормально и долго РАБОТАЕТ !!! Тут маленькая форма из двух циклов заняла 4 дня траханины. Это даже не секс - это некая 64 bit ...ОПА. Насчет замечаний - принято, полагаю еще буду вопрошать Всем спасибо за участие и вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2021, 00:19 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X, ЧИТД. У вас где-то проблема с памятью. Т.е. при уничтожении dll она подчищает за собой память и очищает память, которая используется в основном модуле. Сменив тип объекта вы изменили и занятую память так, что в данный момент dll перестала залазить на чужую память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2021, 09:29 |
|
||
|
Ошибка при работе с потоками в DLL
|
|||
|---|---|---|---|
|
#18+
HOME_X В момент закрытие библиотеки DLL после выполнения всего процесса FreeLibrary(LibHandle); Безотносительно прочего и ошибки, в которой таки стоит разобраться, пока она не стрельнула иначе где-нибудь ещё - я не понимаю, откуда и зачем у людей странное стремление выгружать DLL посреди работы. Для чего, только для того, чтобы чуть позже пользователь тратил дополнительное время, ожидая повторной загрузки? Лично я знаю две разумных причины для такой выгрузки: 1. Обновление (смена версии dll) 2. Во время отладки вносить изменения в dll, не перезапуская exe HOME_X и сообщения о статусе выполнения работ передается в основную форму TStatusBar.Panels[1].Text:='Work/Closed и т.д.' Это архитектурная ошибка, которую стоит исправить. Потоку незачем знать о каких-то статуспанелях. Его дело - отрапортовать о своём состоянии (главной форме или отдельному объекту). А уж тот пусть решает, вывести ли это текстом в статусбар, какой-нибудь иконкой или вообще забить. Это не вопрос потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2021, 11:29 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037336]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 168ms |

| 0 / 0 |
