Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40069302&tid=2037336]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
197ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 318ms |

| 0 / 0 |
