|
|
|
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39894888&tid=2038666]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 453ms |

| 0 / 0 |
