|
|
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
В общем есть поток, в котором готовится и потом через Synchronize рисует изображение. Пока учусь и тренируюсь такие вещи рисовать,потому изображение тестовое. Вроде всё хорошо рисует, обновляет и прочее, но после значительного количества итераций (много тысяч) программа зависает (not response). При том может зависнуть на 1000 итерации, а может пол часа нормально крутить и докрутить до 50000 не зависнув. Никаких сообщений о памяти, ресурсах, доступе, и прочем нет. Зависает скорее через время, нежели чем от числа повторений, если sleep поставить меньше, то и зависнет при меньшем числе итераций, но время зависания тоже разное, иногда почти сразу, иногда очень долго. В потоке к форме не обращаюсь нигде, кроме ShowResult; (ну очень старался, вроде всё проверил) Код приведу, сильно не бить за качество, не уверен что поможет. Хотя бы подскажите, как можно отловить причину зависания, как такие вещи в компиляторе отслеживать? Кода очень много в программе, куча обработчиков на кучи событий у кучи компонентов. Но зависает без каких-либо действий с моей стороны. Код: 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. Ну и вызываемые процедурки: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 15:12 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичВ потоке к форме не обращаюсь нигде, кроме ShowResultАндрей Игоревич Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 15:33 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Про дофигища глобальных переменных я молчу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 15:35 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей ИгоревичВ потоке к форме не обращаюсь нигде, кроме ShowResultАндрей Игоревич Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap Но в данном случае я же просто спрашиваю размер, никак не изменяя, он мне нужен при каждой итерации (если пользователь растянул или уменьшил окно). Да и этот код я вставил уже позже, когда зависания уже были. А чем плох запрос значения глобальной переменной без изменения её значения (далее я хотел бы рисовать куда более сложные изображения с сотнями параметров, вводить (а затем ещё и постоянно обновлять) их в поток через указатели или ещё как было бы ну очень проблемно). TBitmap сейчас опробую, может ли быть в этом причина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 16:01 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич_Vasilisk_пропущено... пропущено... Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap Но в данном случае я же просто спрашиваю размер, никак не изменяя, он мне нужен при каждой итерации (если пользователь растянул или уменьшил окно). Да и этот код я вставил уже позже, когда зависания уже были. А чем плох запрос значения глобальной переменной без изменения её значения (далее я хотел бы рисовать куда более сложные изображения с сотнями параметров, вводить (а затем ещё и постоянно обновлять) их в поток через указатели или ещё как было бы ну очень проблемно). TBitmap сейчас опробую, может ли быть в этом причина? Не забывай про Canvas.Lock / Unlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 16:04 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНо в данном случае я же просто спрашиваю размер, никак не изменяяЕсли слово нельзя для вас не аргумент, то почитайте Рихтера. У него очень хорошо расписана работа с разными потоками Андрей ИгоревичА чем плох запрос значения глобальной переменной без изменения её значенияТем, что это значение внезапно может измениться Андрей Игоревичих в поток через указателиЧитайте Рихтера Андрей Игоревичещё как было бы ну очень проблемноБросайте вы это занятие. Программирование это одна сплошная проблема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 16:26 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Ни TBitmap, ни TCanvas не стоит использовать в потоках. ВСЯ отрисовка с созданием необходимых классов - должна быть в основном потоке. И нет необходимости пересоздавать на каждый чих TImage. В потоке только подготовка данных. Если уж очень хочется что-то поместить в поток - то только голый GDI или GDI+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 16:42 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей ИгоревичНо в данном случае я же просто спрашиваю размер, никак не изменяяЕсли слово нельзя для вас не аргумент, то почитайте Рихтера. У него очень хорошо расписана работа с разными потоками Андрей ИгоревичА чем плох запрос значения глобальной переменной без изменения её значенияТем, что это значение внезапно может измениться Андрей Игоревичих в поток через указателиЧитайте Рихтера Андрей Игоревичещё как было бы ну очень проблемноБросайте вы это занятие. Программирование это одна сплошная проблема Вот вроде и ответили, а вроде и зачем это написали? К чему? Меня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходит. Возможно сделаю иначе. Но расчеты трехмерных полей и объектов вещь специфическая (колоссальные объемы данных и параметров) и часто я понимаю, что сделать так как обычно делают становиться невозможно ли запредельно сложно. Вот лучше скажите, как очистить BitMap чтоб не происходило "переполнение ресурсов". Если MyImage.Picture:=nil; с этим справлялось, то, например MyBitMap.FreeImage - нет. Можно, конечно в каждом цикле создавать (Create) и освобождать(Free), что в принципе прекрасно работает - но выглядит это как-то неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 16:54 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
white_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках. Ну, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда оно происходит. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:01 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно. Андрей ИгоревичМеня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходитНикогда не смотрел на сигналы светофора. Меня устраивает, если я просто перебегаю дорогу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:03 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
white_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках. ВСЯ отрисовка с созданием необходимых классов - должна быть в основном потоке. И нет необходимости пересоздавать на каждый чих TImage. В потоке только подготовка данных. Если уж очень хочется что-то поместить в поток - то только голый GDI или GDI+ А как тогда реализовать такую задачу - есть программа "оболочка", есть расчетные программы, расчетные программы каждые н-секунд сохраняют результаты расчетов на жесткий диск, данные постоянно подгружаются оболочкой (висит процесс который раз в Х-секунд сканирует ключевые папки) и будет выводить на экран результаты расчетов. При этом чтобы все возможности оболочки по обработке данных были доступны, так время полное расчета исчисляться днями и неделями . Пока я реализовал через поток, который подгружает данные и рисует их на нужных мне Image и кроме упомянутого зависания проблем никаких не было. Вроде через BitMap уже минут 20 крутиться и не зависло, если и не зависнет - то как бы, почем не стоит использовать? В чем потенциальная проблема? Любимого всеми Рихтера я обязательно почитаю, но чуть-чуть попозже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:04 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНу, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда оно происходит.Поверь, с учётом квалификации автора как программиста - лучше сразу расставить флажки. К тому-же неизвестно как этот TBitmap и его канва будут использоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:07 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
не взлетит. тут программист нужен. (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:09 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичвисит процесс который раз в Х-секунд сканирует ключевые папкиFindFirstChangeNotification, ReadDirectoryChangesW Андрей Игоревичтак время полное расчета исчисляться днями и неделями .А отрисовка тоже занимает недели? Загрузили расчет, за неделю рассчитали, отдали данные в главный поток - за пару секунд нарисовали Андрей Игоревичи кроме упомянутого зависания проблем никаких не былоУдачи в перебегании дорог ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:10 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно. Если причина именно из-за опасности изменения переменной на ходу - то я понимаю и принимаю эту опасность, так как для того, что бы ей избежать нужно приложить огромное количество дополнительных усилий. Если там есть ещё какие-то опасности (например обращение к глобальным переменным может вызвать какой-то конфликт) то очень прошу рассказать об этом. _Vasilisk_Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно. Андрей ИгоревичМеня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходитНикогда не смотрел на сигналы светофора. Меня устраивает, если я просто перебегаю дорогу Если я живу городе где 3 машины, а светофоры могут гореть красным по много часов и даже дней - возможно это единственный выбор адекватно передвигаться по городу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:10 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
white_niggerнеизвестно как этот TBitmap и его канва будут использоваться Да это-то в общем-то известно: в потоке на нём будет что-то рисоваться, а потом отдаваться в главный поток на отображение. Но в целом архитектура, описанная им выше, кривовата на мой взгляд. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:11 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичвозможно это единственный выбор адекватно передвигаться по городу.А возможно и нет. Особенно если в результате выбора есть возможность попасть на кладбище. Но, чтобы знать о всех возможностях, нужно книжки читать. А у васАндрей ИгоревичЛюбимого всеми Рихтера я обязательно почитаю, но чуть-чуть попозже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:14 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Так в общем случае неизвестно через чего "будет рисоваться" - хорошо если сам всё полностью можешь контролировать. И то опыт нужен. Например при разработке нашего TileControl обнаружилось, что стандартный JPEG идущий в поставке делфей нельзя использовать в потоках. Казалось бы - простая математика, процесс декодирования просится в поток. Но нашлись ситуации, правда не помню под какими версиями. Пришлось заюзать для потока декодер из системного GdiPlus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:20 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей Игоревичвисит процесс который раз в Х-секунд сканирует ключевые папкиFindFirstChangeNotification, ReadDirectoryChangesW Андрей Игоревичтак время полное расчета исчисляться днями и неделями .А отрисовка тоже занимает недели? Загрузили расчет, за неделю рассчитали, отдали данные в главный поток - за пару секунд нарисовали Андрей Игоревичи кроме упомянутого зависания проблем никаких не былоУдачи в перебегании дорог Со сканированием папок проблем нет, но спасибо данные варианты тоже рассмотрю. Отрисовка занимает миллисекунды. Но отрисовывать надо каждый раз когда появились новые данные (раз в несколько секунд), рисовать после окончания расчета - это уже отдельный вопрос. Ну от подскажите, как передать в поток, допустим, сотню разных параметров (там, как отдельные, числа, строки, булевы, массивы всего вышеупомянутого записи, куча всего и вся всех видов цветов и форм, помимо этого массивы значений на сотни тысяч элементов). При том, чтоб это не было жутко трудоемко. В общем поток уже 40 минут крутится и обновляет картинку, пока ничего не зависло, судя по всему проблему из названия темы решить удалось путем перехода на BitMap. (но пока не уверен). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:21 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovwhite_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках. Ну, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда оно происходит. Что-то примитивное только, GraphUtils например совсем не потокобезопасный. Да и каждую виртуальную процу рассматривать под микроскопом то ещё удовольствие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 17:34 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметров (там, как отдельные, числа, строки, булевы, массивы всего вышеупомянутого записи, куча всего и вся всех видов цветов и форм, помимо этого массивы значений на сотни тысяч элементов).Это очень просто. Сделать соответствующую логику (архитектуру) у своей программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 18:03 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметровОбернуть их в одну запись. При этом не забывать о синхронизации Простейший вариант Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 18:05 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметровОбернуть их в одну запись. При этом не забывать о синхронизации Простейший вариант Код: 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. Спасибо, постараюсь использовать. На тему Рихтера (книга - "Программирование под Windows"?) - будет время, почитаю, объёмное произведение. Но стоит понимать, что программирование для меня не цель, а средство решения рабочих задач. Форма более не виснет, вопрос из заглавия темы решен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 13:50 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Код: 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. Хотя мне и не понятно использование property и критической секции, в чем смысл таких перестраховок? Или есть необходимость. Для меня это выглядит как если перед каждым действием мы проверяем все переменные на существование, на форматирование, на соответствие каким нибудь условиям, заключаем всё в try exept finaly, ещё чего-нибудь для защиты, а кода внутри i+j=k; Обычно если код не работает значит всё, хана, убиваем программу и ищем ошибку, варианты чтоб программа не умерла, но сделала часть кода не верно или не сделала вообще - обычно меня не устраивают... Может это для ситуаций разработки программ большими группами или когда стабильность работы программы важнее результата? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 14:19 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичОбычно если код не работает значит всё, хана, убиваем программу и ищем ошибку, варианты чтоб программа не умерла, но сделала часть кода не верно или не сделала вообще - обычно меня не устраивают...Обычно софтина как раз работает у всех прекрасно. НО! Данные разных юзеров хранит, как хочется ей, а не как её автору/юзверю Также не надо зарекаться от железных аварий и стихий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 15:07 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичМожет это для ситуаций разработки программ большими группами или когда стабильность работы программы важнее результата? Постовой: (останавливает машину). Сержант Петров! Попрошу документы! Водитель: Добрый день! П: Документы ваши! Права! В: И не говорите. Очень жарко. П: Права! В: А? П: Вы плохо слышите? В: Говорите громче. П:(орет). Вы нарушили правила! Ваши права! В: Вы правы. Очень жарко. Я весь мокрый. А вы? П: Вы что, глухой? Какой знак висит? Знак висит какой?! В: Где? П: Вон, наверху! В: Я вижу, я не глухой. П: Красное с желтым наверху для чего повешено? В: Кстати, там что-то висит, надо снять — отвлекает. П: Посередине на желтом фоне, что чернеет такое красное? В: Громче, очень жарко! П: Вы глухой? В: Я плохо вижу. П: Глухой да еще и слепой, что ли?! В: Не слышу! П: Как же вы за руль сели? В: Спасибо, я не курю. Да вы не волнуйтесь. Вон в машине двое. Один видит, другой слышит! А я рулю. П: Черная стрелка направо зачеркнута. Это что значит? Не слышу. В: Вы что, глухой? Зачеркнута? Неверно, поставили, потом зачеркнули. П: Вы в своем уме? Это значит, направо поворачивать нельзя. В: Кто вам сказал? П: Я что, по-вашему, идиот? В: Вы много на себя берете. Куда я, по-вашему, повернул? П: Повернули направо. В: Да вы что? Я поворачивал налево. Вы просто не тем боком стоите. П: Господи! Где у вас лево? В: Вот у меня лево. Вот левая рука, вот правая! А у вас? П: Тьфу! Хорошо, вон идет прохожий, спросим у него. Слава богу, у нас не все идиоты. Товарищ! Ответьте: какая рука левая, какая правая? Пр:(вытягиваясь по стойке “смирно”). Виноватый! П: Я не спрашиваю вашу фамилию. Какая рука левая, какая правая? Пр: Первый раз слышу. П: Не иначе в сумасшедшем доме день открытых дверей. Какая ваша левая рука правая? Пр: Лично у меня эта левая, а эта правая. Или с сегодняшнего дня переименовали? В: А вы не верили, товарищ сержант. Видите, у нас руки совпадают, а у вас перепутаны. П:(недоуменно разглядывает свои руки). Ничего не понимаю. Пр: Я могу идти? П: Идите, идите! Пр: Куда? П: Идите прямо, никуда не сворачивая, и уйдите отсюда подальше! Пр: Спасибо, что подсказали. А то два часа иду, не могу понять куда! (Уходит.) В: Вам надо что-то делать с руками. Я никому не скажу, но при вашей работе могут быть неприятности. П: И я про вас никому. Езжайте! Да, когда свернете налево, ну вы-то направо, там проезд запрещен, обрыв. Но вам туда можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 15:12 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичХотя мне и не понятно использование property и критической секции, в чем смысл таких перестраховок? Или есть необходимость. Сейчас Ваша программа работает правильно случайно, просто везёт. Либо Вам кажется, что она работает правильно, а не самом деле - не очень. А синхронизация общих данных разных потоков необходима для того, чтобы она работала всегда правильно. Чтобы не было ошибок в логике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 15:22 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
GatorАндрей ИгоревичОбычно если код не работает значит всё, хана, убиваем программу и ищем ошибку, варианты чтоб программа не умерла, но сделала часть кода не верно или не сделала вообще - обычно меня не устраивают...Обычно софтина как раз работает у всех прекрасно. НО! Данные разных юзеров хранит, как хочется ей, а не как её автору/юзверю Также не надо зарекаться от железных аварий и стихий. Ну так если ошибка в данных - сразу всё "Шоумессадж("Алярма, тут косяк"), чего дальше программу-то продолжать. YuRockАндрей ИгоревичХотя мне и не понятно использование property и критической секции, в чем смысл таких перестраховок? Или есть необходимость. Сейчас Ваша программа работает правильно случайно, просто везёт. Либо Вам кажется, что она работает правильно, а не самом деле - не очень. А синхронизация общих данных разных потоков необходима для того, чтобы она работала всегда правильно. Чтобы не было ошибок в логике. Против синхронизации ничего не имею и почему она важна - я понимаю, я тут скорее о избыточной защите направленной на сохранение стабильности программы после возникновения ошибки, ну типа у нас некорректно присвоились данные, но мы всё равно очистим память или покинем критическую секцию, а то не дай боже переполнение или ещё какой косяк. Для меня же - "у нас некорректное присвоение" - всё, хана, катастрофа, ядерная война, неправильно считает, срочно всё остановить и искать причину, что мне там до finally, потерь памяти и критических секций. Возможно я ошибаюсь, но нужна ли мне вообще критическая секция? Почему так пишут везде - я понимаю, как с привычкой не направлять оружие на людей. Я вот первые 50 раз писал If (Sender is ....) then (Sender as ...). ... , а потом подумал: зачем? Я точно знаю что и как я посылаю, а если уж неправильно послал - то это уже само по себе причина всё остановить исправить ибо дальше то код неправильно работает, хотя сообщение об ошибке бы избежали. Потому отказался от этого, хотя вон на форумах тоже за такое гадости пишут :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:30 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНу так если ошибка в данных - сразу всё "Шоумессадж("Алярма, тут косяк"), чего дальше программу-то продолжать.И как ты догадаешься, что данные кривые? Чтобы флаг поднять и ревун нажать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:50 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичПротив синхронизации ничего не имею и почему она важна - я понимаю, я тут скорее о избыточной защите направленной на сохранение стабильности программы после возникновения ошибкиСинхронизация общих данных не имеет отношения к сохранению стабильности программы после возникновения ошибки. Она нужна для того, чтобы в этом случае верно работала логика программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 18:10 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичВозможно я ошибаюсь, но нужна ли мне вообще критическая секция?Без неё при обращении к общим данным ты будешь получать значения, которые можно скорее назвать случайными, а не правильными. (не говоря уже об автоматических типах (если они используются), с которыми есть 100%-й шанс рано или поздно попасть на в лучшем случае Access Violation). Если такое поведение устраивает - то не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 18:15 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
YuRockАндрей ИгоревичВозможно я ошибаюсь, но нужна ли мне вообще критическая секция?Без неё при обращении к общим данным ты будешь получать значения, которые можно скорее назвать случайными, а не правильными. (не говоря уже об автоматических типах (если они используются), с которыми есть 100%-й шанс рано или поздно попасть на в лучшем случае Access Violation). Если такое поведение устраивает - то не нужна. Если я присваиваю локальной переменной глобальную (и наоборот) через Synchronize (для всех потоков) по какой причине и где у меня могут возникнуть "случайные" данные? Возможно я действительно что-то не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 18:29 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЕсли я присваиваю локальной переменной глобальную (и наоборот) через Synchronize (для всех потоков) по какой причине и где у меня могут возникнуть "случайные" данные? Возможно я действительно что-то не понимаю.Если так - то "случайных" данных не возникнет. Только "через Synchronize " - это не синхронизация, а вызов метода в потоке VCL. Что огромнейший тормоз (не говоря о подводных камнях этого метода) для всех потоков по сравнению с критической секцией, предназначенной для синхронизации конкретных данных. Synchronize был [криво] придуман для другой конкретной задачи - для того, чтобы выполнить метод оконного потока VCL. Но совсем не для синхронизации любых данных. Если его использовать для всего - то смысл в доп. потоках вообще пропадает (это как минимум). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 19:04 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичЕсли я присваиваю локальной переменной глобальную (и наоборот) через Synchronize Наоборот у вас нет. Вы к ней в потоке обращаетесь без Synchronize Андрей Игоревичпо какой причине и где у меня могут возникнуть "случайные" данные?Данные могут быть неконсистентными Пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. что выведет MessageBox? Любую следующую комбинацию 0, 0 100, 0 100, 200 300, 200 300, 400. Причем переписывание первого потока к такому виду Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. абсолютно ничего не изменит. А вот такой код Код: 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. даст только такие комбинации 0, 0 100, 200 300, 400. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 13:53 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
[quot _Vasilisk_]Андрей ИгоревичЕсли я присваиваю локальной переменной глобальную (и наоборот) через Synchronize Наоборот у вас нет. Вы к ней в потоке обращаетесь без Synchronize Андрей Игоревичпо какой причине и где у меня могут возникнуть "случайные" данные?Данные могут быть неконсистентными Пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. что выведет MessageBox? Любую следующую комбинацию 0, 0 100, 0 100, 200 300, 200 300, 400. Причем переписывание первого потока к такому виду Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. абсолютно ничего не изменит. А вот такой код Код: 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. В том что я написал в первом комментарии - это было чисто тестовая тренировочная картинка (которая, кстати, прекрасно работает со всеми глобальными переменными что бы и как бы я не пытался сделать, но это не суть, для серьезных расчетов буду через Synchronize или, может даже быть, через критическую секцию (когда пойму зачем). А вот в вашем примере - в первом потоке вы через Synchronize выводите данные, а втором - напрямую. Это же некорректно в моём понимании, раз уж мы используем Synchronize - то строго во всех потоках, что бы присвоение было последовательным... Насколько я понимаю, Synchronize просто "останавливает" главный поток впихивая туда выполнение своих задач. А критическая секция блокирует часть памяти на время работы с ней, при этом если главный поток не обращается к этой памяти - то он продолжает работать (кстати, а что будет - если обратится?). С учётом того, что у меня главный поток никаких расчетов не делает и занят исключительно обработкой действий пользователя, то трата 10е-5 секунды на присвоение данных, мягко говоря - незаметно, но с точки зрения кода - радикально проще, чем критическая секция. А кстати, почему, например, нельзя использовать один специальный, отличный от главного, поток для синхронизации данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 18:28 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА кстати, почему, например, нельзя использовать один специальный, отличный от главного, поток для синхронизации данных?можно, только зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 18:39 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Андрей ИгоревичА кстати, почему, например, нельзя использовать один специальный, отличный от главного, поток для синхронизации данных?можно, только зачем?Вот-вот. Для синхронизации данных ненужно использовать потоки. Иначе в итоге всё будет выполняться в этом, одном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 18:53 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНасколько я понимаю, Synchronize просто "останавливает" главный поток впихивая туда выполнение своих задач.Нет. Syncronize говорит главному потоку, что нужно выполнить некий кусок кода. Главный поток выполняет его, когда посчитает нужным, а потом уведомляет вызвавший поток о том, что выполнение кода завершено. После этого вызвавший поток продолжает работу Андрей ИгоревичА критическая секция блокирует часть памяти на время работы с ней,Нет. Критическая секция это флаг "ждите". Каждый, кто обратится к занятой критической секции будет ждать ее освобождения Андрей Игоревичпри этом если главный поток не обращается к этой памяти - то он продолжает работатьникто не мешает обращаться к любой памяти. Но если это делать в обход критической секции, то толку от такой секции ноль Андрей Игоревичс точки зрения кода - радикально проще, чем критическая секция.Что сложного вы видите в критической секции? РихтерЗапомните несколько важных вещей. Если у Вас есть ресурс, разделяемый несколь кими потоками, Вы должны создать экземпляр структуры CRITICAL_SECTION. Так как я пишу эти строки в самолете, позвольте провести следующую аналогию. Структура CRITICAL_SECTION похожа на туалетную кабинку в самолете, а данные, которые нуж но защитить, — на унитаз, Туалетная кабинка (критическая секция) в самолете очень маленькая, и единовременно в ней может находиться только один человек (поток), пользующийся унитазом (защищенным ресурсом) .................... Самое сложное — запомнить, что любой участок кода, работающего с разде ляемым ресурсом, нужно заключить в вызовы функций EnterCrtticalSection и LeaveCriticalSection. Если Вы забудете сделать это хотя бы в одном месте, ре сурс может быть поврежден Так, если в FirstThread убрать вызовы EnterCritical Section и LeaveCriticalSection, содержимое переменных g_nIndex и g_dwTimes станет некорректным — даже несмотря на то что в SecondThread функции EnterCriticalSection и LeaveCriticalSection вызываются правильно. Забыв вызвать эти функции, Вы уподобитесь человеку, который рвется в туалетную кабинку, не обращая внимания па то, есть в ней кто-нибудь или нет. Поток пробивает себе путь к ресурсу и берется им манипулировать. Как Вы прекрасно понимаете, стоит лить одному потоку проявить такую "грубость", и Ваш ресурс станет кучкой бесполезных байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 20:26 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Андрей ИгоревичНасколько я понимаю, Synchronize просто "останавливает" главный поток впихивая туда выполнение своих задач.Нет. Syncronize говорит главному потоку, что нужно выполнить некий кусок кода. Главный поток выполняет его, когда посчитает нужным, а потом уведомляет вызвавший поток о том, что выполнение кода завершено. После этого вызвавший поток продолжает работу А в чем разница? Когда выполняется код в Synchronize главный поток по сути остановлен. В какой момент он его выполняет - отдельный вопрос. _Vasilisk_Андрей ИгоревичА критическая секция блокирует часть памяти на время работы с ней,Нет. Критическая секция это флаг "ждите". Каждый, кто обратится к занятой критической секции будет ждать ее освобождения Хммм, если флаг "ждите" не есть блокирование памяти, то что тогда блокирование??? _Vasilisk__Vasilisk_Андрей Игоревичпри этом если главный поток не обращается к этой памяти - то он продолжает работатьникто не мешает обращаться к любой памяти. Но если это делать в обход критической секции, то толку от такой секции ноль Ну как бы да... Никто и не спорит. _Vasilisk_Андрей Игоревичс точки зрения кода - радикально проще, чем критическая секция.Что сложного вы видите в критической секции? Простейший вызов Syncronize в нужных местах или постоянные Enter Leave, за которыми, очевидно, надо крайне внимательно следить. Ну на первый взгляд это как динамические массивы, вроде что там сложного - но как я их ненавижу. Вообще я не против Критической секции, но в моих задачах пока не вижу в ней преимущества над Syncronize, может изменю своё мнение позже. А вообще для риалтайм рисования мне кажется я вообще забью на всё это и буду использовать глобальные переменные. Ошибки в данных там не критичны (ну нарисует один "кадр" с ошибкой, пофиг, всё равно это не вспомогательные картинки), но вот как представлю запихивание сотен параметров в запись и распихивание обратно, потом постоянные синхронизации по мере выполнения (хоть Syncronize, хоть критической секцией) - в уже готовый (и кучу времени писавшийся) и отлично работающий в главном потоке код - потом покрываюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2019, 20:58 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Вроде всё рассказали и объяснили. Ан нет - надо разложить грабли и кататься на самодельном велосипеде... Неужели нет желания подрасти как программист? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2019, 23:27 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
white_niggerВроде всё рассказали и объяснили. Ан нет - надо разложить грабли и кататься на самодельном велосипеде... Неужели нет желания подрасти как программист? О чем речь? Всё что было написано и предложено в данной теме запрогал, потестил, остановился на том, что удобнее для моей задачи оставив в уме остальное. Думаю будут подходящие задачи - воспользуюсь и остальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 14:43 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичwhite_niggerВроде всё рассказали и объяснили. Ан нет - надо разложить грабли и кататься на самодельном велосипеде... Неужели нет желания подрасти как программист? О чем речь? Всё что было написано и предложено в данной теме запрогал, потестил, остановился на том, что удобнее для моей задачи оставив в уме остальное. Думаю будут подходящие задачи - воспользуюсь и остальным.Написал говнокод и успокоился. Так себе достижение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 22:19 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
asutp2Андрей Игоревичпропущено... О чем речь? Всё что было написано и предложено в данной теме запрогал, потестил, остановился на том, что удобнее для моей задачи оставив в уме остальное. Думаю будут подходящие задачи - воспользуюсь и остальным.Написал говнокод и успокоился. Так себе достижение. Недостаточно аргументированное утверждение, как в части кода, так и в части "успокоился". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2019, 23:40 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичwhite_niggerВроде всё рассказали и объяснили. Ан нет - надо разложить грабли и кататься на самодельном велосипеде... Неужели нет желания подрасти как программист? О чем речь? Всё что было написано и предложено в данной теме запрогал, потестил, остановился на том, что удобнее для моей задачи оставив в уме остальное. Думаю будут подходящие задачи - воспользуюсь и остальным.никто вам ничего не будет доказывать, за исключением отдельных индивидов. Считаешь работает правильно и удобно - ну молодец, но большинство считает что это не так, бывает конечно что большинсто ошибается, но это явно не тот случай. Да и "почему-то зависает" должно наводить на определённые мысли. какая дельфи то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2019, 09:09 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Андрей Игоревичпропущено... О чем речь? Всё что было написано и предложено в данной теме запрогал, потестил, остановился на том, что удобнее для моей задачи оставив в уме остальное. Думаю будут подходящие задачи - воспользуюсь и остальным.никто вам ничего не будет доказывать, за исключением отдельных индивидов. Считаешь работает правильно и удобно - ну молодец, но большинство считает что это не так, бывает конечно что большинсто ошибается, но это явно не тот случай. Да и "почему-то зависает" должно наводить на определённые мысли. какая дельфи то? Был к в командировке, не мог отвечать. Исходный код более не зависает благодаря помощи форумчан. После этого обсуждение свелось к обсуждению необходимости использования критической секции, качественно синхронизации данных и преимущества КС над Синхронизацией. Где я лишь высказался, что для моей задачи Синхронизация проще. Для других задач буду использовать КС, за пример использования которой большое спасибо. Ну и раз уж обсуждаем всё о потоках возникло ещё пару вопросов, возможно подскажите: 1. Поток считывает данные с файлов в приватную запись (с динамическим массивом на первом уровне), после определенного размера (точно не понял где-то 500+мб) поток выдает "Out of memory" и завершается. У потока есть какое-то ограничение по размеру меньшее чем для 32битных приложений? Сложно ли его обойти? Или я просто в чем то ошибаюсь в коде? В ответ на возможную критику размеров массивов - пространственные распределения значений (поля) ещё и во времени, размер массивов может быть и миллионы, и миллиарды, и и даже триллионы значений. (в данном случае 2х гб - 32 бит вполне хватит). 2. При завершения потока все приватные переменные класса гарантированно выгрузятся из памяти или надо предусматривать очистку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 09:02 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) какая дельфи то? Вообще стоит 7я и последняя (какая она там 10.5?). Пишу на 7 так как в той версии что стоит у меня куча визуальных "примочек" очень упрощающих работу с кодом. В 10.5 нормально компилируется и работает (правда .exe вырастает с 700кб до 3.5мб). Для 10.* версий есть "плагины" (или как они называются) для удобной работы с кодом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 09:06 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич1. Поток считывает данные с файлов в приватную запись (с динамическим массивом на первом уровне), после определенного размера (точно не понял где-то 500+мб) поток выдает "Out of memory" и завершается. У потока есть какое-то ограничение по размеру меньшее чем для 32битных приложений? Сложно ли его обойти? Или я просто в чем то ошибаюсь в коде? В ответ на возможную критику размеров массивов - пространственные распределения значений (поля) ещё и во времени, размер массивов может быть и миллионы, и миллиарды, и и даже триллионы значений. (в данном случае 2х гб - 32 бит вполне хватит). 2. При завершения потока все приватные переменные класса гарантированно выгрузятся из памяти или надо предусматривать очистку? 1. динамический массив при ресайзе сначала создаёт новый блок, а потом, скопировав, удаляет существующий следовательно память таким макаром можно использовать где-то 2/3 от макс - т.е. желательно её сразу задать нужного размера 2. память освободится "автоматически" после удаления объекта-владельца динамического массива, но никто не запрещает это сделать вручную в любое время через SetLength(..., 0) или ... :=nil PS: у потока нет "своей памяти", он использует память процесса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 09:17 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Могу добавить что при при общем дохуа памяти, она может быть сильно фрагментирована и непрерывного куска нужного размера может не быть. Т.е. свободен гигабайт, а выделить под мемори стрим 200Мб может не получиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 13:16 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичИли я просто в чем то ошибаюсь в коде?скорее в архитектуре. использовать т.о. большие непрерывные массивы с их реаллокаций при росте это путь в ... то место где вы оказались ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 13:49 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
Если элементы невелики, а размеры большие, придется осваивать распределенные массивы. Ничего сложного, просто блоки определенного размера, объединенные под капотом записи с методами доступа, которая будет пересчитывать общий индекс в индекс блока и индекс элемента. Если элементы большие, то можно распределять их динамически, а в массиве хранить указатели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 15:05 |
|
||
|
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)1. динамический массив при ресайзе сначала создаёт новый блок, а потом, скопировав, удаляет существующий следовательно память таким макаром можно использовать где-то 2/3 от макс - т.е. желательно её сразу задать нужного размера 2. память освободится "автоматически" после удаления объекта-владельца динамического массива, но никто не запрещает это сделать вручную в любое время через SetLength(..., 0) или ... :=nil PS: у потока нет "своей памяти", он использует память процессаwhite_niggerМогу добавить что при при общем дохуа памяти, она может быть сильно фрагментирована и непрерывного куска нужного размера может не быть. Т.е. свободен гигабайт, а выделить под мемори стрим 200Мб может не получитьсяВасилий 2Если элементы невелики, а размеры большие, придется осваивать распределенные массивы. Ничего сложного, просто блоки определенного размера, объединенные под капотом записи с методами доступа, которая будет пересчитывать общий индекс в индекс блока и индекс элемента. Если элементы большие, то можно распределять их динамически, а в массиве хранить указатели Ясно, спасибо, пошел думать и изучать. Всё как всегда сложнее, чем на первый взгляд казалось. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 18:05 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039245]: |
0ms |
get settings: |
4ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
143ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 415ms |

| 0 / 0 |
