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

start [/forum/topic.php?fid=58&msg=39902474&tid=2038666]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 555ms |

| 0 / 0 |
