|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
Ну, пример прилагаю, иначе не объяснишь. Есть список телефонов в столбик. В тестовом test.txt примерно 21000 записей. Для чтения текстовухи используется некий класс ClsText, стибренный не помню уже как давно кажется на этом форуме. Даб не скучно было на это смотреть выводится форма FormProgress, отражающая как движутся дела. Проблемы две. 1. Процесс все замедляется, замедляется и может сдохнуть где-то после 15000. А на нетестовом более нагруженном графикой и т.п. проекте после 10000. Это если не дышать. Если елозить мышью и т.п. то можно сдохнуть его и побыстрее. 2. По основной форме лучше не "елозить" -можно и завесить. Как минимум будет внешне "не отвечать". Как оптимизировать это дело с точки зрения красивого восприятия/устойчивости и м.б. скорости? Что можно сделать? (FileSystemГлюкоObject не предлагать). Подчеркну, что если список на 1000-2000 номеров то проблемы/дискомфорт "почти не ощущаются". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 03:11 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
пример не смотрел 1. системный (виндоус) листвью (а все остальные элементы управления так или иначе его пользуют как правило) имеет режим в котором можно добавлять только идентификаторы (интовый ид) а когда нужно отрисовать определенный элемент вызывается специальная коллбек функция которую должен реализовать пользователь листвью эта функция должа вернуть параметры для построения листвью итема так можно хоть миллион записей добавить и при этом быстро 2. кроме того можно на время когда идет добавление элементов в список запретить перерисовку листвью это также очень ускорит процесс 3. к сожалению бейсика под рукой нет ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 03:26 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 11:12 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
Код: vbnet 1.
Это полный ппц, при каждой итерации цикла перебирается весь листвью. Зачем это нужно если используется "key" & str_to_add? При попытке добавить уже существующее значение возникнет ошибка, которую нужно тупо проигнорировать. При большом количестве записей это тоже замедлит заполнение, потому что ошибки будут возникать чаще, но это все равно не идет ни в какое сравнение со сканированием listview. Так же в коде дофига неоптимизированных текстовых манипуляций. После всех исправлений заполнение заняло менее 15 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 11:47 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
Antonariy, похоже Вы правы. Так нормально? (код ниже) Поясню: Особенно >попытке добавить уже существующее значение возникнет ошибка, которую нужно тупо проигнорировать. 1. If Err.NUMBER = 0 Then 'ListViewSetItemPicture ListPhones, LItem.Index, 0 LItem.SubItems(1) = str_to_add End If Иначе перезапишется предыдущий LItem.SubItems(1) Разумно? 2. Код выделения последнего итема убрал один раз в конец 3. >дофига неоптимизированных текстовых манипуляций. Я делаю следующее: 1) убираю явно непреемлимые символы: кавычки (' и '') , двоеточие ( : ) Переносы Chr(10) и Chr(13) наверно не надо? Так? Ведь класс читает построчно. Буквы кстати допустимы (вместо номера телефона допустимо использовать UserName) 2) Убираю Trim() пробелы и {TAB} -главное вначале строки 3) Считаю ограничителем либо пробел, либо {TAB}, либо " ; " Т.е. телефоном считается первое слово в строчке. Строчка может сожержать дополнительную-ненужную информацию. Что там можно оптимизировать? P.S. Ну естественно от абсолютного дурака который подсунет "не список телефонов" здесь защиты быть в принципе не может. Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 16:18 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
Дмитрий77 Что там можно оптимизировать?Как минимум заменить Left на Left$ и т.д. Самое лучшее, это выкинуть clsText, считать в текстовую переменную сразу все (тем более, что этот класс и так все загоняет память, но в совершенно диком виде), серией replace или регулярным выражением убрать мусор и разбить (Split) на массив по vbCrLf. Останется только залить его в listview без лишних вывертов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 20:12 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
AntonariyКак минимум заменить Left на Left$ серией replace Это я сделал, остальное лениво. Какая-то "нехилая работа" с ProgressBar должна ж ощущаться (15 сек на 20000 записей уже не плохо), зря чтоль картинки-рюшечки через API рисовал...Компьютер же не задарма электричество кушает, пусть время чуть тратит, показывает чего делает. Да и юзер пусть считает что умная программа интеллектуальной деятельностью занимается. Вы мне лучше подскажите как сделать чтобы форма в "не отвечает" не переходила пока процесс идет (если мышью елозить). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 21:12 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
авторВы мне лучше подскажите как сделать чтобы форма в "не отвечает" не переходила пока процесс идет (если мышью елозить). надо DoEvents поставить в цикле только не каждую итерацию а вызывать через 100 циклов например или мерять интервал времени и по прошествии интервала вызывать скажем каждые 500 мл сек ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 21:23 |
|
Чтение из большой текстовухи в ListView
|
|||
---|---|---|---|
#18+
пример не смотрелнадо DoEvents поставить в цикле только не каждую итерацию а вызывать через 100 циклов например да спасибо, вполне прилично Код: vbnet 1. 2. 3. 4.
пример не смотрелили мерять интервал времени и по прошествии интервала вызывать скажем каждые 500 мл сек попытался таймером играться с переменной true/false, но не прокатило, да и бог с ним ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2011, 23:21 |
|
|
start [/forum/topic.php?fid=60&fpage=88&tid=2158187]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 328ms |
total: | 479ms |
0 / 0 |