|
|
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#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. С выделением памяти особых проблем нет (если не выделил - сразу словишь ошибку и поправишь), то вот с высвобождением есть вопросы; 1. Если у меня динамические массивы глубокой вложенности, тот воспользовавшись SetLenght(Array,0) никаких потерь памяти не будет? Вопрос возник после прочтения данной темы https://www.programmersforum.ru/showthread.php?t=126357 2. Если у меня динамический массив классов, если после выделения памяти класса уменьшу массив - память станет недоступна (утечка)? Очистка созданных классов обязательна перед уменьшением массива? Пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 3.1. При создании в классе агрегированых классов (ClassB) Код: pascal 1. 2. 3. При использовании ClassA.Free (или Destroy) будет ли опустошена память которую я выделил под ClassB сама? На данный момент я делаю так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это корректно? Или излишне? 3.2. То же что и 3.1 но если дело будет в потоке, когда поток будет завершен - очиститься ли память от всяких созданных в нем классов, или тоже надо дополнять деструктор? 4. Чуть на другую тему - у меня в Delphi 7 при завершении кода в потоке память не очищается, надо дополнительно использовать Thread.Free; В Делфи 10 такой проблемы нет, после завершения кода память высвобождается. Как в Delphi 7 корректно очистить память после завершения кода потока? (никак не перееду на Delphi 10 ибо раздражают эти мигающие и дергающиеся окошки при компиляции при работе на нескольких мониторах) 5. FreeAndNil применительно к вопросам выше - очистит ли память от агрегированных классов автоматом, если нет - вызовет ли переназначенный деструктор? 6. Если я хочу очистить запись со вложенными динамическими массивами (без классов) до состояния, которое было при её создании, что нужно сделать? Finalize сбросит ли размеры массивов до нулевых? Вроде как через указатели и Get/FreeMem можно, но насколько это корректно? Можно, конечно, создать темповый массив и присваивать его обнуляемому, но как-то костыльно. 7. Ну и вопрос, наверное даже на отдельную тему, но может есть простое решение. Можно ли как нибудь в 32 битной системе решить проблему ограничением на размеры массива. Один элемент массива в памяти занимает 200-300 мегабайт: в скомпилированном в Delphi 7 приложении: после 7го увеличения массива вылетает OutOfMemory; в скомпилированном в Delphi 10 (32 bit) - где-то посл 25го - OutOfMemory; в скомпилированной в Delphi 10 (64 bit) - открывает сколько угодно (ну сотню точно) Можно ли как-то решить данную проблему без компиляции в 64битной делфе, так как интерцейс новой делфи мне пока не очень нравится? Кто-то писал про какие-то распределенные массивы (не понял что это). Может через указатели? И без использования БД! :) Я понимаю, что наиболее логичным мне ответом было бы: - "Иди книжки/Хелп читай". Но в книгах как-то уж очень часто такие вещи опускаются как очевидные, а хелп - это просто уничтожитель времени, зашел, просидел пол дня, ничего не понял :). Заранее огромное спасибо тем, кто заглянул сюда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 16:24 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Вот здесь есть очень наглядный пример: https://programmersforum.ru/showthread.php?t=126357 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:06 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, 1. Всё почистится, утечек не будет 2. Массив будет освобождён, объекты повиснут в памяти 3.1. Объекты сами не очистятся, нужно удалять в деструкторе. Проверка на NIL лишняя 3.2. Тот же ответ, что и в 3.1. 4. У потока есть свойство FreeOnTerminate 5. FreeAndNil это то же самое, что и Free, но дополнительно обнуляет переменную. Ничего дополнительно очищать не будет (ну в исходники-то можно заглянуть, а? 6. Finalize зачистит поля только управляемых типов (строки, дин. массивы, интерфейсы, варианты), все остальные поля остануться неизменёнными. Если требуется полное обнуление, то после Finalize нужно вызвать FillChar 7. Поддержка 64 бит появилась уже в XE2, не обязательно десятку ставить. Вместо массивов можно навелосипедить абстракцию, которая будет иметь интерфейс массива, а внутри раскладывать элементы по блокам и хранить список блоков (например, массив размером в 1000 элементов, при размере блока в 256 элементов, будет замещён в 4 блоках). Но без дженериков напляшешься пользоваться такими структурами. А если брать версию, где есть дженерики... то уж лучше 64 бита :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:11 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyПроверка на NIL лишняяЕсли вызывать Free. А у него Destroy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:23 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Точно, не доглядел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:24 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
GerasimenkoАндрей Игоревич, Вот здесь есть очень наглядный пример: https://programmersforum.ru/showthread.php?t=126357 Андрей Игоревич1. Если у меня динамические массивы глубокой вложенности, тот воспользовавшись SetLenght(Array,0) никаких потерь памяти не будет? Вопрос возник после прочтения данной темы https://www.programmersforum.ru/showthread.php?t=126357 Ну так этож та же тема, и там пишут - что не освобождается (или я чего не понял). Но Kazantsev AlexeyАндрей Игоревич, 1. Всё почистится, утечек не будет Непонятно... Kazantsev AlexeyПроверка на NIL лишняя Проверка на nil на случай если я не создал объект (я там их сотнями создаю и уничтожаю в процессе, в конце только часть существует). А хотя Free и так проверяет на nil..., ну тогда да, хотя что-то у меня с этим было неприятное, с тех пор проверяю. Kazantsev Alexey У потока есть свойство FreeOnTerminate Точно, как я о нем забыл... По тестирую. Kazantsev AlexeyFinalize зачистит поля только управляемых типов (строки, дин. массивы, интерфейсы, варианты), все остальные поля остануться неизменёнными. Если требуется полное обнуление, то после Finalize нужно вызвать FillChar Тут главный вопрос - сбросит ли сами размеры дин масивов до нуля. Kazantsev Alexey7. Поддержка 64 бит появилась уже в XE2, не обязательно десятку ставить. Вместо массивов можно навелосипедить абстракцию, которая будет иметь интерфейс массива, а внутри раскладывать элементы по блокам и хранить список блоков (например, массив размером в 1000 элементов, при размере блока в 256 элементов, будет замещён в 4 блоках). Но без дженериков напляшешься пользоваться такими структурами. А если брать версию, где есть дженерики... то уж лучше 64 бита :) Как-то сложновато и нерационально на первый взгляд. А есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)? И можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:33 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, https://programmersforum.ru/showthread.php?t=126357 Оттуда Код: 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. Проверте на своем массиве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:38 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНепонятно... http://docwiki.embarcadero.com/RADStudio/Rio/en/Dynamic_array#Dynamic_Arrays Dynamic arrays of length 0 have the value nil. Так понятнее? Андрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля. Я же написал, что зачистит. Андрей ИгоревичА есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)? Понятия не имею, я всю эту светомузыку отключаю. Андрей ИгоревичИ можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию? Можно поставить не десятку и жить спокойно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:45 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Gerasimenko, Освобождаемая память очищаться не обязана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:48 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyGerasimenko, Освобождаемая память очищаться не обязана.И? Пример то как раз и хорош! Я бы даже сказал, отличный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 17:51 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
GerasimenkoИ? Пример то как раз и хорош! Я бы даже сказал, отличный. Если память освободили, но не очистили, она ещё сколько угодно будет сохранять прежние данные, пока они не будут затёрты новыми. А код зашибись, конечно. Читать по протухшему указателю это прям то что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 18:01 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyGerasimenkoИ? Пример то как раз и хорош! Я бы даже сказал, отличный. Если память освободили, но не очистили, она ещё сколько угодно будет сохранять прежние данные, пока они не будут затёрты новыми. А код зашибись, конечно. Читать по протухшему указателю это прям то что нужно.На грабли легко наступить, как выше Вам писали авторЕсли вызывать Free. А у него Destroy Грабли: они везде расставлены... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 18:03 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
GerasimenkoНа грабли легко наступить, как выше Вам писали Ага, только там всё-же Free оказался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 18:12 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля. Finalize ничего не делает с размерами массивов, она просто проходится по всем вложенным массивам и записям и освобождает память, занятую под управляемые типы (string, interface и т.п.). Причём только освобождает (т.е. уменьшает счётчики ссылок и делает FreeMem() при необходимости), ЕМНИП она даже не изменяет сами значения полей. SetLength(SomeArray, 0) вызывает Finalize автоматом, если знает что в массиве есть управляемые типы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 19:23 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
И можно сделать, чтоб 10ка при компиляции не сходила с ума масштабируя себя 10 раз (зачем-то перебрасывает окно на основной монитор, затем растягивает, затем ещё что-то делает) и тратя на это в 10 раз больше времени, чем на компиляцию? В заголовке Delphi есть выпадающий список desktop-ов. Когда Вы открыли проект, то у Вас скорее всего установлен desktop "Default Layout". Затем Вы запускаете проект на отладку, и у Вас меняется desktop на "Debug Layout". По какой то причине, у Вас в этом Desktop-е окно Delphi настроено на расположение в другом мониторе. Соответственно, в режиме отладки переместите среду Delphi на тот монитор, который Вам нужен, потом нажмите на кнопочку рядом с выпадающим списком desktop-ов и выберите Save desktop. После этого, расположение окон в desktop-е "Default Layout" сравняется с desktop-ом "Debug Lauout". И после этого, у Вас при запуске проекта на отладку перестанут дергаться окошки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2019, 20:14 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyАндрей ИгоревичА есть 10я версия делфи сопоставимая по удобности и интерфейсу с 7кой с кучей плагинов (цветные линии, подсветка выделенных переменных, куча всего по мелочи)? Понятия не имею, я всю эту светомузыку отключаю. Помню-помню, настоящие программисты пишут код исключительно в блокноте - остальное от лукавого :). Просто привык уже этому и сильно ускоряет поиск ошибок. Kazantsev Alexey http://docwiki.embarcadero.com/RADStudio/Rio/en/Dynamic_array#Dynamic_Arrays Dynamic arrays of length 0 have the value nil.Так понятнее?alekcvpАндрей ИгоревичТут главный вопрос - сбросит ли сами размеры дин масивов до нуля. Finalize ничего не делает с размерами массивов, она просто проходится по всем вложенным массивам и записям и освобождает память, занятую под управляемые типы (string, interface и т.п.). Причём только освобождает (т.е. уменьшает счётчики ссылок и делает FreeMem() при необходимости), ЕМНИП она даже не изменяет сами значения полей. SetLength(SomeArray, 0) вызывает Finalize автоматом, если знает что в массиве есть управляемые типы. Понял, спасибо, просто не был уверен, что это делается на всю глубину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 10:32 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Короче. Есть управляемые типы - дин.массивы, строки. Их освобождение - за компилятором. Вручную можно освободить присвоив соответственно nil или '' либо setlength(0). В записях тоже работает это правило, и все управляемые поля записи также освобождаются автоматом - об этом заботится Finalize. Есть классы, которые надо создавать и удалять самому. ТС-у: первой строкой в проекте сделай ReportMemoryLeaksOnShutdown := True; и не гадай на кофейной гуще. А еще лучше - скачай FastMM, подключи его первым модулем в файле проекта и в FastMM4Options.inc в строке {.$define FullDebugModeWhenDLLAvailable} удали точку. Тогда будешь детально видеть, есть ли утечка и что конкретно утекло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 10:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
...продолжается дезинформационная кампания, совмещенная с вирусной рекламой фастмм4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 11:06 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
ёёёёё...продолжается дезинформационная кампания, совмещенная с вирусной рекламой фастмм4. "Когда вы говорите, Иван Васильевич, такое впечатление, что вы бредите" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 11:24 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
А как именно FreeOnTerminate завершает поток и очищает память? Пример: В делфи7 я могу открыть в потоке 7 массивов за раз. Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов; Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает. Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)... Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка. Как оно работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 17:34 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Мда. FreeOnTerminate освобождает память, фактически вызывает MyThread.Free. Никакой связи с тем. что там в потоке делалось тут нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 17:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
"Объект" потока и собственно поток имеют только тут связь, что первое удобно инкапсулирует управление вторым. Но не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 17:43 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА как именно FreeOnTerminate завершает поток и очищает память? Пример: В делфи7 я могу открыть в потоке 7 массивов за раз. Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов; Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает. Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)... Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка. Как оно работает? FreeOnTerminate := True просто автоматом вызывает TThread.Destroy() после того как завершится выполнение TThread.Execute(). Всё что вы там выделили внутри этого потока - вам же и освобождать в своём деструкторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2019, 18:14 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Андрей ИгоревичА как именно FreeOnTerminate завершает поток и очищает память? Пример: В делфи7 я могу открыть в потоке 7 массивов за раз. Если FreeOnTerminate:=false и перед вызовом массива я предварительно FreeAndNil(Thread) - то я могу раз за разом открывать эти 7 массивов; Если FreeOnTerminate:=true и я ничего не делают перед очередным переотркытием файлов - то 7 я уже отрыть не могу, вылетает ошибка нехватки памяти. Но если открывать по одному (и, вероятно, по 6), то хоть 7, хоть 100 - ничего не вылетает. Итого получается, что FreeOnTerminate оставляет что-то в памяти, но потом как-то высвобождает (при вызове?)... Ну и при FreeOnTerminate проверка Thread<>nil - проходит, но при вызове чего бы то ни было (free,Terminate), вылетает ошибка. Как оно работает? FreeOnTerminate := True просто автоматом вызывает TThread.Destroy() после того как завершится выполнение TThread.Execute(). Всё что вы там выделили внутри этого потока - вам же и освобождать в своём деструкторе. Я несколько не о том (или о том). Примитивный код: unit1 Код: 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. 34. 35. unit2 Код: pascal 1. 2. 3. 4. 5. По факту - Thread.Free не делает поток Nil Thread.FreeOnTerminate:=True; - тоже не делает поток nil. насколько я понимаю - они только обнуляют все данные, если у меня в потоке создаются огромные массивы - они остаются, занимая память (хотя и обновляются) (в компиляторе их можно прощелкать на всю глубину и посмотреть на нули) Ну и соответственно проверка на nil тоже не проходит, поток не nil, но вызвать free - уже нельзя, вылетит ошибка памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 17:38 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичПо факту - Thread.Free не делает поток Nil Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать. Это азы работы с указателями. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 17:45 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич если у меня в потоке создаются огромные массивы - они остаются, занимая память Андрей Игоревич в компиляторе их можно прощелкать на всю глубину и посмотреть на нули ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 17:54 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:31 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Это и так делается внутри FreeAndNil, не учи человека плохому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:49 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Андрей ИгоревичПо факту - Thread.Free не делает поток Nil Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать. Это азы работы с указателями. Но почему для остальных классов деструктор очищает указатели, а для потоков - нет? И почему тогда штатный Free этого не учитывает (например как предложил Док) и после завершения потока вылетает с ошибкой доступа к памяти. _Vasilisk_ Андрей Игоревич если у меня в потоке создаются огромные массивы - они остаются, занимая память Андрей Игоревич в компиляторе их можно прощелкать на всю глубину и посмотреть на нули Надо потестировать, у других классов ведь полностью очищаются. А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Спасибо, очень пригодиться. А вот есть вопрос из другой оперы (из-за которого я опять вернулся к этому :) ) Вот запускаю я множество потоков, по результатам у меня происходит событие (ну так я сделал) в основном потоке, как сделать так что бы срабатывало только событие последнего выполняемого потока, считать потоки? При том я не знаю сколько у меня потоков и какой именно будет последним. Считать потоки в событии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Это и так делается внутри FreeAndNil, не учи человека плохому Если FreeOnTerminate:=true то FreeAndNil вылетит с ошибкой доступа к памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 18:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Если FreeOnTerminate:=true то FreeAndNil вылетит с ошибкой доступа к памяти. довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:15 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Dimitry Sibiryakov пропущено... Естественно не делает. Не забота объекта следить сколько у тебя указателей на него. Ты их можешь присвоить хоть миллион, хоть миллиард. Сам наплодил - самому и очищать. Это азы работы с указателями. Но почему для остальных классов деструктор очищает указатели, а для потоков - нет? И почему тогда штатный Free этого не учитывает (например как предложил Док) и после завершения потока вылетает с ошибкой доступа к памяти. _Vasilisk_ пропущено... Нет пропущено... Вы видите случайный мусор того, что осталось по старым указателям Надо потестировать, у других классов ведь полностью очищаются. А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? Dimitry Sibiryakov и _Vasilisk_ вам правильно написали, надо расти над собой сам навыделал, сам и чисти, мы же про системный язык, а не про яву рассуждаем??? хотя есть решения и для ленивых 11957089 Андрей Игоревич Док Андрей Игоревич, чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. Спасибо, очень пригодиться. А вот есть вопрос из другой оперы (из-за которого я опять вернулся к этому :) ) Вот запускаю я множество потоков, по результатам у меня происходит событие (ну так я сделал) в основном потоке, как сделать так что бы срабатывало только событие последнего выполняемого потока, считать потоки? При том я не знаю сколько у меня потоков и какой именно будет последним. Считать потоки в событии? ну вот "посмотреть что делает этот метод" не судьба? или работать надо? не пользуйтесь FreeOnTerminate:=true и всё будет более-менее в порядке хотя с тем, что архитектура TThread вызывает много вопросов я очень даже согласен, но что есть то есть бага записанная в кучу копий, становится фичей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:36 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич А если у меня будет миллиард указателей в потоке (ну вдруг я так программирую) - они таки будут сжирать гигабайт памяти? При выполнении этих правил никакая память утекать не будет. Док чтобы не ловить AV при освобождении несуществующего объекта, попробуй Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:48 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) FreeOnTerminate:=true это совсем другой расклад довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНо почему для остальных классов деструктор очищает указатели Что-то ты путаешь. Ни для каких классов освобождение памяти не изменяет значение указателя. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:55 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) ну вот "посмотреть что делает этот метод" не судьба? или работать надо? А как правильно проверять существование потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 19:57 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич А как правильно проверять существование потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 20:05 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА как правильно проверять существование потока? Правильно - никак. Потоки это оружие класс FaF. Ты его запускаешь, а дальше оно уже само. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 20:10 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич kealon(Ruslan) ну вот "посмотреть что делает этот метод" не судьба? или работать надо? А как правильно проверять существование потока? 1. Если указатель на поток не сохраняется ("TMyThread2.Create;"), то никак. 2. Если указатель на поток сохраняется ("th := TMyThread2.Create;"), то обязательно самому FreeAndNil-ить поток и соответственно "существует" == "th <> nil". FreeOnTerminate - только для п.1 3. Если хочется проверить, завершился ли поток, то есть например ReturnValue, но его все равно надо будет выставить в Execute самому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 21:39 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 3. Если хочется проверить, завершился ли поток, то есть например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 22:32 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
авторНо почему для остальных классов деструктор очищает указатели, Никакой класс не очищает указатель и TThread как представитель классов этого конечно же не делает. Надежно чистить указатель на TThread можно в OnTerminate потока, вне зависимости от флага FreeOnTerminate. Другое дело что проверка указателя на nil с включенным флагом FreeOnTerminate мало что гарантирует: 1. Делаем проверку на nil. Поток еще живой 2. Поток надумал закончится, зашел в OnTerminate, обнулил ссылку на себя 3. Обращаемся к потоку получаем AV. Из плюсов то, что OnTerminate выполняется синхронно с основным потоком. Поэтому могут существовать кейсы когда это будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2019, 23:02 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ kealon(Ruslan) FreeOnTerminate:=true это совсем другой расклад довольно низкоуровневый примитив что бы свободно применять его в юзер-коде для этого нужно очень веское основание Код: pascal 1. 2. 3. 4. makhaon авторНо почему для остальных классов деструктор очищает указатели, Никакой класс не очищает указатель и TThread как представитель классов этого конечно же не делает. Надежно чистить указатель на TThread можно в OnTerminate потока, вне зависимости от флага FreeOnTerminate. Другое дело что проверка указателя на nil с включенным флагом FreeOnTerminate мало что гарантирует: 1. Делаем проверку на nil. Поток еще живой 2. Поток надумал закончится, зашел в OnTerminate, обнулил ссылку на себя 3. Обращаемся к потоку получаем AV. Из плюсов то, что OnTerminate выполняется синхронно с основным потоком. Поэтому могут существовать кейсы когда это будет работать. налопшичить кучу кода, и всё ради "высвободить хэндл как поток завершится", ну и нафига? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 00:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Док, советуешь феерическую хрень. че хрень-то сразу? :) В Лазаре, промежду прочим, если не подставлять эту прокладку, в некоторых случаях получаешь ошибку еще на этапе компиляции. Я сейчас точно ситуацию не воспроизведу кодом (лень, если честно). Но когда я плотно изучал работу потоков, частенько с этим сталкивался. kealon(Ruslan) не пользуйтесь FreeOnTerminate:=true и всё будет более-менее в порядке им нужно пользоваться, только надо знать где и как :) Я для себя определил так: - если экземпляр потока объявлен в локальной переменной, то FreeOnTerminate:=true, ибо после выхода из процедуры видимость переменной все равно потеряется и nil-ить ее специально нет никакой необходимости. - во всех остальных случаях FreeOnTerminate:= false и FreeAndNil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 01:12 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док че хрень-то сразу? :) В Лазаре, промежду прочим, если не подставлять эту прокладку, в некоторых случаях получаешь ошибку еще на этапе компиляции. Я сейчас точно ситуацию не воспроизведу кодом (лень, если честно). Но когда я плотно изучал работу потоков, частенько с этим сталкивался. Внутри FreeAndNil и так вызывается проверка на Assigned, как и в Free. Вот, че. Уже ж проходили много раз. А если в указателе (в "переменной объекта") мусор, то эта проверка - абсолютно бесполезна к тому же. Док - если экземпляр потока объявлен в локальной переменной, то FreeOnTerminate:=true Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 01:41 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 08:36 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock При чем тут Лазарь-не Лазарь, потоки... Внутри FreeAndNil и так вызывается проверка на Assigned, как и в Free. В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал kealon(Ruslan) при выходе из программы стопорнуть поток как правило всё равно надо это ты о чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 08:51 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал Ты в потроха TObject.Free загляни и узнаешь великую тайну - чем он отличается от .Destroy :) Док kealon(Ruslan) при выходе из программы стопорнуть поток как правило всё равно надо это ты о чем? Подозреваю он о том, что при завершении программы нельзя оставлять в памяти работающие потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 09:43 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, может так проще будет: автор Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А внутреннюю очистку как-то самостоятельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 09:44 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) YuRock Если ждать результатов выполнения потока не нужно, если не нужно управлять потоком - то можно можно использовать FreeOnTerminate, я бы сказал так. kealon(Ruslan) Кроме того, при выходе из программы стопорнуть поток как правило всё равно надо, и тут начинаются проблемы. Если надо все же вручную закрывать - значит FreeOnTerminate не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 10:17 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док В лазаре так (fpc3.0.4: ..\source\rtl\objpas\sysutils\sysutils.inc) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Возможно в дельфях по-другому, давно в потроха не заглядывал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 10:18 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Василий 2 3. Если хочется проверить, завершился ли поток, то есть например Кстати да, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 10:55 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Ты в потроха TObject.Free загляни и узнаешь великую тайну - чем он отличается от .Destroy :) Ну, таки-да: Код: pascal 1. 2. 3. 4. 5. 6. 7. Тем не менее, без проверки на существование объекта ТС получает AV :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 11:37 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док, AV он получает по совсем другому поводу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 12:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Kast2K#22022404 Kast2K Андрей Игоревич, может так проще будет: автор Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А внутреннюю очистку как-то самостоятельно... Выглядит понятно и приятно, попробую так использовать. Очистка это понятно, тут без вопросов. alekcvp Василий 2 3. Если хочется проверить, завершился ли поток, то есть например Надо изучить и попробовать. Ну а всё-таки, глобальный то вопрос в чем - есть куча потоков, которые заканчиваются в разное неизвестное время (открываются и обрабатываются результаты разных расчётов), как по окончании всех потоков вызвать только одно событие, желательно не организую новый поток и не останавливая вызывающий (так я могу). Ну или в радикальном случае, как гарантировать последовательное выполнение кода события (чтоб при окончании одного потока его событие не влезло в середину предыдущего, попробовал через критическую секцию - но не получилось, но, вероятно, что-то я сделал не так, может как-нибудь иначе можно?) Ну и вопрос просто о правильности кода (ибо есть сомнения). Я сделал так, что в конце потока я генерирую событие в основной форме,вызов события делаю через Sinhronize: Примерно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Событием сделал потому, что стараюсь все модули сделать максимально независимыми (желательно полностью) и подключаемыми через библиотеки делфи, так у меня мозг не закипает всех взаимных связей в программе, ну и я могу тестировать модули в отдельных программах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 13:06 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич есть куча потоков, которые заканчиваются в разное неизвестное время (открываются и обрабатываются результаты разных расчётов), как по окончании всех потоков вызвать только одно событие, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 13:41 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Можно из потока при завершении дергать основной модуль и ему пихать результаты. Или можно из основного модуля ждать, пока поток закончит, считывать результаты из поля объекта и удалять его. Если отправка результатов происходит только единожды за время жизни потока - на мой взгляд, лучше второй вариант. + не нужен Synchronize + главный модуль все равно следит за состоянием потоков, ему не проблема при завершении забрать данные + нет передачи управления, или как там оно правильно называется - не знаток терминологии паттернов и прочих абстракций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 13:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 + не нужен Synchronize К слову, на лазарусовском форуме тамошние олдфаги настоятельно рекомендуют использовать именно встроенные механизмы общения доп.потока с основным в противовес sendmessages/postmessages. Особенно с учётом кроссплатформенности. И после некоторого своего опыта ия вынужден был согласиться с их доводами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 17:14 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док К слову, на лазарусовском форуме тамошние олдфаги настоятельно рекомендуют использовать именно встроенные механизмы общения доп.потока с основным в противовес sendmessages/postmessages. Особенно с учётом кроссплатформенности. И после некоторого своего опыта ия вынужден был согласиться с их доводами Олдфаги такие... олдфаги. Они ж сделали мультиплатформенную очередь сообщений, почему бы его не применять. Да и банальный ThreadQueue никто не отменял На Praxis, кстати, тамошние олдфаги имеют прямо противоположное мнение насчет синхронайза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 17:41 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док Особенно с учётом кроссплатформенности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 17:47 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock kealon(Ruslan) пропущено... Но таких ситуаций ничтожно мало. kealon(Ruslan) Кроме того, при выходе из программы стопорнуть поток как правило всё равно надо, и тут начинаются проблемы. Если надо все же вручную закрывать - значит FreeOnTerminate не подходит. Да, там есть такая фигня, но вот незадача, если есть куча используемых в этом потоке юнитов и они финализируются, могут начаться "чудеса". Особенно это актуально при сопровождении такого кода, когда идёт кусочная добавка и вполне работающий код может превратиться в тыкву. У меня тоже бывало, что иначе ещё хуже выходит, но если при баге вижу что это вбито просто так, я лучше перепишу от греха подальше. Делал как-то трюк с record + interface для финализации что бы не использовать напрямую такое недоразумение как TThread. Вполне живо было, но выходило слишком громоздко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 19:39 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, _Vasilisk_, еще лучше разобраться с WaitForMultipleObjects: https://stackoverflow.com/questions/6867105/waiting-for-multiples-threads-using-waitformultipleobjects ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 19:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
makhaon еще лучше разобраться с WaitForMultipleObjects: Дальше, там ограничение в 64 хэндла, а ТС хочет потоки запускать и останавливать. Ну и никакого FreeOnTerminate (или предварительный вызов DuplicateHandle()) В общем для этой задачи атомарный инкремент/декремент гораздо правильное решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2019, 20:31 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Там вообще про модуль Windows нужно забыть Не совсем так. Методы описаны в LCLInfl и LCLType, формально работают на кроссплатформе, но... я уже писал про это выше ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2019, 00:15 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Всё указанные способы попробовал, всё работает, огромное спасибо. Теперь следующий вопрос в познании программирования :). А надо ли очищать память при выходе из программы, у меня в главном потоке в процессе работы создается (и используется) огромное число разнообразных классов - нужно ли их высвобождать при закрытии, или система всё зачистит и так? Вопрос совсем не в тему, но мелоковат на отдельную тему. Есть программы, которые периодически скидывают данные в текстовые файлы, есть одна программа, которая периодически эти данные считывает. Записываются файлы классическим WriteLn, считываются TSringList.LoadFromFile(); Но! Иногда при считывании вылетала ошибка о том, что файл открыт на запись (что логично), на данный момент обыграл функцией проверяющей доступность файла, вроде не вылетает ошибка, но может просто везет. функция проверки доступности FileIsUse Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. В коде делают так Код: pascal 1. 2. Но как-то сомнения, что так правильно. Ну и обратный вопрос LoadFromFile() не блокирует файл для записи? (что гораздо страшнее, так записывающую программу ломать очень не хочется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 17:06 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич нужно ли их высвобождать при закрытии Андрей Игоревич или система всё зачистит и так? Андрей Игоревич Вопрос совсем не в тему, Андрей Игоревич Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 17:40 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич В коде делают так Код: pascal 1. 2. можно сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:09 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Андрей Игоревич В коде делают так Код: pascal 1. 2. можно сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode Обработку исключений в принципе уже видел на всех форумах, но не слишком ли это? И нет никаких проблем при обработке исключений в потоке? TFileStream и FileMode подумаю, просто где-то на форумах видел утверждение, что LoadFromFile не блокирует, но утверждение уровне комментария на ответы.майл.ру :). Надо подумать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичИ нет никаких проблем при обработке исключений в потоке? Проблемы неизбежны если НЕ обрабатывать исключения в потоке. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Андрей ИгоревичИ нет никаких проблем при обработке исключений в потоке? Проблемы неизбежны если НЕ обрабатывать исключения в потоке. Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 20:20 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры. 1. Главное чтобы в блоке except не было ничего, что может хотя бы в теории вернуть необработанное исключение. 2. try ... finally / except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86), но вне их они не критичны. Есть даже такая команда Abort , которая вызывает "тихое" исключение (стандартный обработчик его не отображает), которая используется для быстрого выхода из процедур большого уровня вложенности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 21:01 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Андрей Игоревич В коде делают так Код: pascal 1. 2. можно сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode alekcvp Андрей Игоревич Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры. 1. Главное чтобы в блоке except не было ничего, что может хотя бы в теории вернуть необработанное исключение. 2. try ... finally / except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86), но вне их они не критичны. Есть даже такая команда Abort , которая вызывает "тихое" исключение (стандартный обработчик его не отображает), которая используется для быстрого выхода из процедур большого уровня вложенности. а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы. за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 23:29 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) меня всегда удивляет, где вы всё это находите а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы. А меня всегда удивляет, что люди начинают отвечать не попытавшись понять прочитанное. Я отвечал не на отрывок с кодом выше, а про обработку исключений в потоках. Где там про глухой except было? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 10:46 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) меня всегда удивляет, где вы всё это находите а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы. за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл Вот только не надо ортодоксальности. Всё зависит от цели. Если цель - открыть файл, то совершенно без разницы, по какой там причине вспухло исключение. К тому же есть дополнение насчет ловли и счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 10:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp, по вашему посту подчёркнуто "Главное" - Не Главное, эксепшены группируются в список, это вполне нормальная ситуация для анализа ошибки - тынц Василий 2 kealon(Ruslan) меня всегда удивляет, где вы всё это находите а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы. за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл Вот только не надо ортодоксальности. Всё зависит от цели. Если цель - открыть файл, то совершенно без разницы, по какой там причине вспухло исключение. К тому же есть дополнение насчет ловли и счетчика. Всегда лучше чётко описать конкретные исключения, отправив неизвестное гулять дальше - это не такая большая проблема. PS: если подцепить обработчик крашей вроде EurekaLog или Madshi, то сопровождение приложения заметно улучшится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 12:49 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) try ... finally/except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:19 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Тут больше дело в проблемах возникающих в таком коде при сопровождении, человек примет это как данность, а не угрозу - размножит этот подход (а чёп нет, просто же?), код даже из этого примера легко разрастётся, могут проявиться другие исключения. Из-за такого вот упрощения поиск ошибки в коде может занять очень длительное время. Всегда лучше чётко описать конкретные исключения, отправив неизвестное гулять дальше - это не такая большая проблема. PS: если подцепить обработчик крашей вроде EurekaLog или Madshi, то сопровождение приложения заметно улучшится Это всё верно, но в данном случае - из пушки по воробьям. Вроде того Hello world MVC с листингом на три экрана. Но согласен, что такие допущения должны вноситься осознанно. Barmaley57 kealon(Ruslan) try ... finally/except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86) Нет, замерил специально, try секции замедляют почти в три раза. Ops/sec: 1716247 / 612494. Правда, значимой задержка начинает быть при кол-ве итераций от 150 млн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:41 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
del, дубль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Barmaley57 пропущено... ЕМНИП, тормоза будут только в случае исключительных ситуаций. Нет, замерил специально, try секции замедляют почти в три раза. Ops/sec: 1716247 / 612494. Правда, значимой задержка начинает быть при кол-ве итераций от 150 млн. В x86 обработка исключений никак не регулируется стандартом. для try-секции компилятор создаёт допкод, который записывает в стек инфу для восстановления - естественно это будет замедлять основной код В x64 допкод не создаётся, компилятор только добавляется раскрутку в блок данных программы, соответственно и try-блок не добавляет кода и не замедляет выполнение. Но это сильно затрудняет анализ, отсюда и обработка исключения в случае его появления будет медленее, чем на x86. Например, в питоне, особенно активно используются исключения для различных ветвлений, это давало довольно сильные тормоза для x64-билда. PS: всё вышесказанное относится к компиляции под винду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 17:36 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) alekcvp, по вашему посту подчёркнуто "Главное" - Не Главное, эксепшены группируются в список, это вполне нормальная ситуация для анализа ошибки - тынц Ага, цитата по вашей же ссылке:по-умолчанию, вложенные исключения не запоминаются. Чтобы сохранить вложенное исключение, вам нужно возбудить его через Exception.RaiseOuterException (стиль Delphi) или Exception.ThrowOuterException (стиль C++ Builder). Это как с трассировкой стека: они сделали возможность , но если вам это надо, то реализацию пишите сами, ручками. Т.е. очевидно что по-умолчанию там ничего хорошего не получится. И кроме того, мы говорили о потоках , а в потоках за пределы Execute() никакие исключения выходить не должны, да?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 17:44 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Это как с трассировкой стека: они сделали возможность , но если вам это надо, то реализацию пишите сами, ручками. Т.е. очевидно что по-умолчанию там ничего хорошего не получится. И кроме того, мы говорили о потоках , а в потоках за пределы Execute() никакие исключения выходить не должны, да?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:04 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp в потоках за пределы Execute() никакие исключения выходить не должны, да?.. Код: 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. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:07 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ alekcvp в потоках за пределы Execute() никакие исключения выходить не должны, да?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:58 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp, да, у них там косяк Код: 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. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 19:10 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) alekcvp, да, у них там косяк и в этом обработчике исключение нельзя выпускать Сегодня нельзя в этом, завтра нельзя в другом, мораль: не хочешь проблем - не выпускай ни в каком :) Там в самом DoTerminate, вроде, ещё какая-то обработка исключений есть. Исходников просто сейчас нет под рукой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 21:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp, нету там ничего для защиты Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 10:02 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Thread.FreeOnTerminate:=True; - тоже не делает поток nil. FreeOnTerminate имеет смысл использовать только если ты создал поток и отпустил его в свободное плавание. или в деструкторе потока сам озаботился очистить за собой единственную ссылку где-нить в списке потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 13:35 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Нет, замерил специально, try секции замедляют почти в три раза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 14:19 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Barmaley57 Василий 2 Нет, замерил специально, try секции замедляют почти в три раза. foo:=i :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 18:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 foo:=i :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 19:07 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
rgreat Василий 2 foo:=i :D То же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 19:45 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 rgreat пропущено... А если без отладчика и в release запустить? То же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 21:05 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Barmaley57 Василий 2 пропущено... То же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 21:44 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock Barmaley57 пропущено... Значит там есть и except блок и finally. Только с except потеря - максимум 20% Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 10:13 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp> почему не сделать конструкцию вида: try .. except ... finally ... end ? Насколько я помню, еще лет 15 назад был соотв. тикет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 10:45 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ? К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally. Тем более, что я бы, например, хотел бы, чтобы можно было регулировать последовательность: и так try ... except ... finally ... end и так try ... finally ... except ... end Но это приведет к ухудшению наглядности кода. Т.ч. лучше (для наглядности) вручную писать два блока, каких хочешь. Так код понятнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 13:30 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally. Мне трудно судить, как там это видно с позиций новичка, но вроде вполне очевидно, что finally должен выполняться в финале, сиречь последним ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 14:37 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
YuRock alekcvp Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ? К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally. Тем более, что я бы, например, хотел бы, чтобы можно было регулировать последовательность: и так try ... except ... finally ... end и так try ... finally ... except ... end Но это приведет к ухудшению наглядности кода. Т.ч. лучше (для наглядности) вручную писать два блока, каких хочешь. Так код понятнее. Очень наглядно: Код: pascal 1. 2. 3. 4. 5. 6. По сравнению с: Код: pascal 1. 2. 3. 4. Последовательность очевидна: try ... except ... finally ... end , т.к. finally из самого названия следует выполняться последней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 14:38 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp Последовательность очевидна: try ... except ... finally ... end , т.к. finally из самого названия следует выполняться последней. Ну хорошо, согласен. Еще один момент. Если в except произойдет еще одно исключение - я так понимаю, что finally всё равно должно выполниться, так все захотят 100%. Получается, для finally компилятору нужно будет сделать еще один неявный блок try ... except . В общем, все не так просто и очевидно, как кажется. В любом случае, мне - более наглядно так: Код: pascal 1. 2. 3. 4. 5. 6. или так: Код: pascal 1. 2. 3. 4. 5. 6. В зависимости от необходимости и ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 15:05 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp YuRock пропущено... Если есть finally - значит есть и except, как минимум неявный. Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ? https://quality.embarcadero.com/browse/RSP-18291 Resolution: Won't Fix Marco Cantù with comment: We are keeping exception blocks as they have been. Works good enough. Ленивые гандоны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 15:11 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
rgreat Ленивые гандоны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 15:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Ты это к тому что они не только ленивые но и криворукие? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 15:45 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
rgreat, Они криворукие и потому ленивые осторожные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2019, 15:49 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Мозг кипит и плавиться из-за безграмотности. Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно). Но суть текущего вопроса вот в чем, по окончании работы Потока я всегда вызываю событие в главном потоке, передаю считанные данные главному потоку. Если потоков много и они почти одновременно вызывают события, то при каком-то стечении обстоятельств (видимо когда накапливается слишком много ожидающих) - вылетает "конец памяти". Хорошо тестируется в чистой программе, где вызвать 100 потоков и назначить событие Onterminate с какими-нибудь действиями. Помимо этого для отлова ошибок я во все ключевые процедуры вначале вставил процедуру в которой отправляю сообщение в "ЛОГ" (вызывая тоже некоторое число процедур для ведения ЛистВиева и сохранения в файл) Код: pascal 1. И, судя по всему, в моменты каллапса с событиями эти сообщения этот каллапс ещё больше увеличивают и всё быстрее падаетс "Концом памяти". Товарищи пряморукие - подскажите, как можно решить таки проблемы?. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 11:40 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
13.12.2019 11:40, Андрей Игоревич пишет: > > Мозг кипит и плавиться из-за безграмотности. Курсы русского языка для взрослых Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 11:49 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий 13.12.2019 11:40, Андрей Игоревич пишет: > > Мозг кипит и плавиться из-за безграмотности. Курсы русского языка для взрослых Как всегда спасибо за дельный и своевременный совет, вы как всегда крайне желанны в любой моей теме. П.С. За ошибку стыдно, как раз отвлекли и писал максимально быстро сообщение, зря. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 12:48 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, вы сможете подготовить приложение (для тестов, с одной кнопкой), в котором бы воспроизводилась проблема и выложить исходники здесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 12:54 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
13.12.2019 12:54, DmSer пишет: > выложить исходники здесь? гы-гы Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 12:58 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Если не хватает памяти, можно попробовать x64, ее сразу станет больше. Либо не заниматься перевыделением памяти, выделять один раз и потом использовать, передавать только ссылки на нее. P.S. PostMessage (DebugForm.Handle,ERROR_DATA_MESSAGE,DWORD(PChar(Er_Message)),DWORD(PChar(Discription))); - плохая идея, если Er_Message и Discription не статичны, возможен вариант, что сообщение ушло, память под строки освободилась, и только тут сообщение начинает обработку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 13:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
DmSer Андрей Игоревич, вы сможете подготовить приложение (для тестов, с одной кнопкой), в котором бы воспроизводилась проблема и выложить исходники здесь? Точно причину не пойму, сейчас в отдельном приложении, вроде, работает, но не хватает времени потестить почему работает, не работало же :), но суть проблемы, что в таком коде периодически вылетает "Конец памяти". Код: 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. 34. А, стоп, яж в событии делаю так Код: pascal 1. 2. 3. 4. 5. А LocOpenResultFiles у меня 300-500 метров.... Тогда может и в этом делало, а не событиях :) Zelius Андрей Игоревич, Если не хватает памяти, можно попробовать x64, ее сразу станет больше. Либо не заниматься перевыделением памяти, выделять один раз и потом использовать, передавать только ссылки на нее. P.S. PostMessage (DebugForm.Handle,ERROR_DATA_MESSAGE,DWORD(PChar(Er_Message)),DWORD(PChar(Discription))); - плохая идея, если Er_Message и Discription не статичны, возможен вариант, что сообщение ушло, память под строки освободилась, и только тут сообщение начинает обработку. 64 использую уже повсеместно (хотя хз, вылетает ли там это сообщение, я там только финально компилирую). А вот про сообщение большое спасибо, то-то у меня периодически какая-то ересь приходило. Как более корректно передавать такие данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 14:22 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Как более корректно передавать такие данные? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 14:51 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 15:53 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Андрей Игоревич Как более корректно передавать такие данные? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. можно так, а если главный поток ничем не занят, то можно не заморачиваться и сделать SendMessage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2019, 18:32 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Zelius можно не заморачиваться и сделать SendMessage а еще можно вызвать потокобезопасные Synchronize/Queue. Немного не изящно, но надежно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2019, 00:20 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Наконец, появилась миллисекунда свободного времени. Zelius можно так, а если главный поток ничем не занят, то можно не заморачиваться и сделать SendMessage Очень часто бывает так, что прям ну очень занят, потому не хотелось бы. Кстати, а можно ли как-то форму целиком запихнуть в отдельный поток, или это слишком сложно, и ну его нафиг? Василий 2 Андрей Игоревич Как более корректно передавать такие данные? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Пока не очень дружил с указателями. Правильно же? такая передача сообщений корректна, real - как пример передачи других данных Код: 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. Но возникает вопрос два вопроса, первый может ли очередь формируемая PostMessage переполниться (например принимающий поток сильно занят) и к чему это приведет? Если сообщение "не доходит" по тем или иным причинам - не будет ли утечки памяти, так как код "Dispose" у нас только в принимающем обработчике. _Vasilisk_ Андрей Игоревич Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно) Не совсем так, у меня код чуть помудренее, ну я там накосячил и уже сам поправил, но теперь вообще всё хочу фундаментально переделать :). (Хочу отдельный поток, который будет запускать другие потоки по очереди и по завершении последнего уже вызывать событие, просто иначе слишком сложные пересечения сообщений и событий в коде между потоками, я просто тону в них) Док Zelius можно не заморачиваться и сделать SendMessage а еще можно вызвать потокобезопасные Synchronize/Queue. Немного не изящно, но надежно :) Синхронайз же будет зависеть от "свободности" главного потока - не хотелось бы, Queue - по не знаю что это пока. (Пока, если честно, как раз через синхронайз и message и передаю данные между потоками, но хочу переделать). Думаю начать освоение применения критической секции, но как я понимаю, для передачи сообщений она не подходит :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 11:24 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Кстати, а можно ли как-то форму целиком запихнуть в отдельный поток, или это слишком сложно, и ну его нафиг? GUI всегда в основном потоке и только в нём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 11:32 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, переполниться может. из MSDN про PostMessage: авторIf the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError returns ERROR_NOT_ENOUGH_QUOTA when the limit is hit. так что надо результат отправки обрабатывать. по умолчанию лимит 10 000. кроме Synchronize есть еще TThread.Queue ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 12:18 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
alekcvp GUI всегда в основном потоке и только в нём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 15:31 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Пока не очень дружил с указателями. Правильно же? ... Но возникает вопрос два вопроса, первый может ли очередь формируемая PostMessage переполниться (например принимающий поток сильно занят) и к чему это приведет? Если сообщение "не доходит" по тем или иным причинам - не будет ли утечки памяти, так как код "Dispose" у нас только в принимающем обработчике. Правильно, только лучше не называть переменные по имени типа (PReal), типы-указатели уже объявлены (^string => PString), и приводить в PostMessage лучше не Integer(), а W/LPARAM(). Вопросы хорошие, очередь конечно может переполниться, т.ч. надо всегда делать Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 17:07 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Синхронайз же будет зависеть от "свободности" главного потока - не хотелось бы, Queue - по не знаю что это пока. (Пока, если честно, как раз через синхронайз и message и передаю данные между потоками, но хочу переделать). чтобы не заморачиваться: Synchronize - потокобезопасный "SendMessage"; Queue - потокобезопасный "PostMessage". И тот, и другой методы позволяют вызывать процедуру доп.потока, где идет работа с основным потоком. Как-то так: В аттаче говнокод, просто для иллюстрации. зы. проект собран на DXE (в семерке Queue еще нет, пусть картинка не вводит в заблуждение :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2019, 23:22 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Док, Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется). А такой вопрос, в каком потоке будет выполнена процедура CallProcedure Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И как правильно передавать сообщение уже между отдельными потоками, а не между главным и второстепенными? Просто на форуме видел фразу "вызвать процедуру соответствующего потока, она точна в нужном потоке будет выполнена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2019, 21:09 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Код: pascal 1. 2. 3. 4. Андрей Игоревич И как правильно передавать сообщение уже между отдельными потоками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2019, 21:22 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Док, Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется). ИМХО, зря, лучше перейти на новое и привыкнуть. в новых дельфах очень много полезного. один юникод чего стоит с TEncoding... Delphi 7 только для легаси, только то что трогать боязно... Второе, что приходить в голову, это использовать дельфевые очереди, тогда с виндовой не надо заморачиваться. Поставил в TThreadedQueue сообщение, а поток сам его заберет когда освободится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 09:54 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Zelius Андрей Игоревич Док, Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется). ИМХО, зря, лучше перейти на новое и привыкнуть. в новых дельфах очень много полезного. один юникод чего стоит с TEncoding... Delphi 7 только для легаси, только то что трогать боязно... Второе, что приходить в голову, это использовать дельфевые очереди, тогда с виндовой не надо заморачиваться. Поставил в TThreadedQueue сообщение, а поток сам его заберет когда освободится. Видимо придется, так как в 7ке вот такой код (код чисто тестовый, искал ошибку и тут нашел) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Почти сразу вылетает с ошибкой конца памяти (при том, что в дипетчере программа занимает жалкие мегабайты (даже с учётом некорректности диспетчера - всё равно мало)); В 10ке (ну или всё дело в 64х) такой код крутиться вечно... Ну значит скоро будет от меня темы: "а как в 10ке сделать всё красиво?" "а почему в х64 компилятор нельзя остановить на строке" и т.п. :) Мне бы хотя бы автоматическое дописывание переменных, их выделение в коде всех сразу и исправление их по Enter согласно написанbю в var, уж больно я к этому привык, жуть как помогает, в мечтах я бы вообще хотел делать код разноцветным, мол "критический код", "проверенный", "доработать", "временный" и прочее подобное, комментарии это конечно круто, но цвета - круче, никто такого не делал под 10ку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 12:55 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, тут ничего не понятно (while 0 = 1), много потоков? на конец памяти влияет подход s := s + 'abc'... в больших циклах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 13:37 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Zelius Андрей Игоревич, тут ничего не понятно (while 0 = 1), много потоков? Та я это от балды написал, чтоб показать, что цикл бесконечный. По идее, даже с таким циклом всё равно код Код: pascal 1. 2. Должен корректно, хоть и бесконечно работать. (в приемке сообщений Dispose(p) естественно есть). а, тупанул, забыл про FreeAndNil написать, В упрощенном формате: Код: pascal 1. 2. 3. 4. 5. 6. 7. ну по сути код а реальности вот так он выглядит в реальности Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как уже написал, в 7ке вылетает с нехваткой памяти, в 10ке и после многих сотен тысяч операций - работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 13:52 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, а какое кол-во потоков в момент вылета? ну и просто на предмет утечек посмотреть стоит, как там его... ReportmemoryLeaksOnExit что ли .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 14:23 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич ну по сути код а реальности вот так он выглядит в реальности Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как уже написал, в 7ке вылетает с нехваткой памяти, в 10ке и после многих сотен тысяч операций - работало. А какой смысл в этом коде, если каждого потока приходится ждать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 14:23 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Василий 2 Андрей Игоревич ну по сути код а реальности вот так он выглядит в реальности Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как уже написал, в 7ке вылетает с нехваткой памяти, в 10ке и после многих сотен тысяч операций - работало. А какой смысл в этом коде, если каждого потока приходится ждать? Просто идея запустить все потоки одновременно, в процессе вызывать события и в конце вызвать одну финальную процедуру пока столкнулась с кучей мелких и очень раздражающих проблем, решил пока сделать тупо, но надежно. Просто события вызываемые потоками происходят не в конце их работы, а по мере считывания данных (я определяю изменившиеся данные, считываю, вызываю события, там куча всякого мудрёного кода). Количество сложностей, с которыми я столкнулся, пока охладили желание в такой реализации, потому сделал последовательно но логически понятно, выковыривать код из потоков ради этого как-то не хочется, тем более для других целей я всё ещё использую эти же потоки (общее открытие результатов, групповое по куче расчётов). В общем потоки, это сложно (для меня), но интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 14:42 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Zelius Андрей Игоревич, а какое кол-во потоков в момент вылета? ну и просто на предмет утечек посмотреть стоит, как там его... ReportmemoryLeaksOnExit что ли .. Потоки сразу убиваются, они поочередно запускаются (просто сразу забыл об этом написал), просто, видимо Postmessage забивала всю очередь и выдавало такую ошибку (ну я предполагаю), в delphi 10ке такого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 14:43 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, все это звучит странно, не должно быть такой разницы... да и "видимо" не дает гарантий что так и было. ну да ладно, дело хозяйское ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 16:47 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Zelius Андрей Игоревич, все это звучит странно, не должно быть такой разницы... да и "видимо" не дает гарантий что так и было. ну да ладно, дело хозяйское ) "Видимо" это я просто предположил, код 100% идентичный, по сути одни и те же модули запускаю из под разных Делфи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 17:22 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, я так понимаю, вопросы лицензионной чистоты тебя не очень заботят? Лишь бы была дельфя? Зря ты с семеркой мучаешься. Возьми на руборде портабельную сборку (последняя "рабочая" там была то ли DXE, то ли DXE2). Они не требуют установки, легко регятся идущими в комплекте генераторами, поддерживают юникод и проч."радости". Если надо, могу кинуть ссылкой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 18:05 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 19:56 |
|
||
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Андрей Игоревич Код: pascal 1. 2. 3. 4. 5. 6. 7. Прием постмесаджей в главном потоке, просто не привел. Та фиг с ним, работает на 10ке (проверил на десятке миллионов циклов) и ладно. Может потом попробую понять почему (хотя будет сложно, если оно работает) Док Андрей Игоревич, я так понимаю, вопросы лицензионной чистоты тебя не очень заботят? Лишь бы была дельфя? Зря ты с семеркой мучаешься. Возьми на руборде портабельную сборку (последняя "рабочая" там была то ли DXE, то ли DXE2). Они не требуют установки, легко регятся идущими в комплекте генераторами, поддерживают юникод и проч."радости". Если надо, могу кинуть ссылкой После нового года займусь изучением вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2019, 23:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038666]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 349ms |

| 0 / 0 |
