|
|
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Здравствуйте все!. :) :) :) Аннотация: Заметил забавную вещь, что когда заполняется, приблизительно минуту, TreeView и процессор загружен не полностью, то это дерево можно уже просматривать, листать... Вопрос: Можно ли организовать заполнение дерева через отдельный поток, чтобы даже во время заполнения, дерево можно было юзать? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 14:04 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
splaynЗдравствуйте все!. :) :) :) Аннотация: Заметил забавную вещь, что когда заполняется, приблизительно минуту, TreeView и процессор загружен не полностью, то это дерево можно уже просматривать, листать... Вопрос: Можно ли организовать заполнение дерева через отдельный поток, чтобы даже во время заполнения, дерево можно было юзать? Заранее благодарен.А чем не устраивает классическая технология заполнения дерева по частям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 17:47 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
UrriА чем не устраивает классическая технология заполнения дерева по частям? А как вы в этом случае организуете поиск по дереву ? Или курсор - источник данных для TreeView всегда читается полностью? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 08:03 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Aleksey-K UrriА чем не устраивает классическая технология заполнения дерева по частям? А как вы в этом случае организуете поиск по дереву ? Или курсор - источник данных для TreeView всегда читается полностью? С уважением, Алексей. Я работаю по такой схеме: При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы. По любому это работает быстрее, чем полное заполнение дерева и поиск узла в дереве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 11:01 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Я работаю по такой схеме: При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы. По любому это работает быстрее, чем полное заполнение дерева и поиск узла в дереве. А если элемента действительно нет, читается весь источник данных? Не так ли?. Т.е. ваш быстрый построитель дерева "работает" до первого неудачного поиска. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 19:16 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Aleksey-K ВладимирМ Я работаю по такой схеме: При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы. По любому это работает быстрее, чем полное заполнение дерева и поиск узла в дереве. А если элемента действительно нет, читается весь источник данных? Не так ли?. Т.е. ваш быстрый построитель дерева "работает" до первого неудачного поиска. С уважением, Алексей Это Вы о чем? Поиск по источнику данных - это оптимизируемый процесс. Поиск по собственно TreeView - заведомо НЕ оптимизируемый процесс. Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения). При сканировании TreeView придется просканировать ВСЕ узлы, а это заведомо ОЧЕНЬ медленный процесс. Более того, здесь НЕТ поля для оптимизации. Придется сканировать именно все и именно одним единственным способом. FoxPro "заточен" под работу с таблицами. Поиск в оперативной памяти (массивы, коллекции), в общем случае, заведомо более медленная операция, чем поиск по таблицам или курсорам (кроме весьма специфических ситуаций) Если речь идет об операции построения дерева "по требованию", то схема такая: При открытии формы строится только первый уровень дерева. Все остальные уровни (вложенные узлы) НЕ создаются. Их создание происходит в момент раскрытия соответствующего узла. Причем опять же строится не вообще все дочерние узлы раскрываемого узла, а только первый уровень от данного родителя. По сути, формируются только те узлы дерева, которые реально просматриваются пользователем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:04 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Понятно.. Т.е. источник данных для TreeView вы читатет всегда весь, а строите дерево по мере раскрытия. Способ хорош, если данные уже полностью "лежат" в локальном источнике, но не очень удобен, когда данные "лежат" на сервере (клиент-сервер) и данных не мало. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:10 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Aleksey-KПонятно.. Т.е. источник данных для TreeView вы читатет всегда весь, а строите дерево по мере раскрытия. Способ хорош, если данные уже полностью "лежат" в локальном источнике, но не очень удобен, когда данные "лежат" на сервере (клиент-сервер) и данных не мало. С уважением, Алексей Алексей, ну пожалуйста, прежде чем возражать, прикиньте, как можно решить проблему и исходите из предположения, что оптимальное (в смысле быстрое) решение уже существует. Данные лежат на сервере. Зачем мне для поиска качать на клиент ВСЕ данные? А ведь для того, чтобы просто построить ВСЕ дерево именно это и надо будет проделать (!) При открытии формы я выкачал с сервера только данные по первому уровню. Для поиска записи я выполняю хранимую процедуру на сервере по нужным параметрам и получаю код искомого узла (или ничего не получаю, если такого нет). Далее достраиваю только необходимые узлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:21 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Владимир, именно это я хотел уcлышать. Значит мы строим дерево для больших таблиц одинаково. Правда я закачиваю не только первый уровень, но уровень +1. Мне так удобнее. Картинкой Node я даю понять есть ли следующие уровни у данного Node. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:30 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения). Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 13:13 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
splayn ВладимирМ Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения). Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел. 1. А как вы формируете Key для Node? 2. А есть ли у вас индекс по таблице, где вы используете SEEK и соответствует ли он Key Node? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 13:57 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Aleksey-K splayn ВладимирМ Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения). Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел. 1. А как вы формируете Key для Node? 2. А есть ли у вас индекс по таблице, где вы используете SEEK и соответствует ли он Key Node? С уважением, Алексей. Есть индекс в таблице, но данные выбираются рекурсивно, а если так строить дерево, когда строится сначала верхний уровень, а потом подуровни, то проблем нет... но нужно отображать все ветки из таблицы, к которым есть привязка определенных записей. Уровень вложенности не имеет значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 14:11 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Как Вы организуете связь между узлом в дереве и записью таблицы? Т.е. как Вы определяете, что вот этот узел TreeView был построен на основании данных из вот этой записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 17:36 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Aleksey-KВладимир, именно это я хотел уcлышать. Значит мы строим дерево для больших таблиц одинаково. Правда я закачиваю не только первый уровень, но уровень +1. Мне так удобнее. Картинкой Node я даю понять есть ли следующие уровни у данного Node. С уважением, АлексейОпять же, если хочется чтобы картинка Node или как бишь ее, всегда показывала правильно, есть ли следующие уровни у данного Node, все неоднозначно. В иных задачах быстрее просто проверить факт, что у данного уровня есть хотя бы один подуровень. А в иных, возможно, и правда быстрее будет построить по всем узлам уровень+1. Самое быстрое решение - рисовать плюсик независимо от того, есть подуровни или нет. Там разберемся (щелкнем и поймем). Но это решение уж не самое удобное, факт. Короче, дерево дереву рознь, и здесь нет универсального решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2006, 22:32 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
ВладимирМКак Вы организуете связь между узлом в дереве и записью таблицы? Т.е. как Вы определяете, что вот этот узел TreeView был построен на основании данных из вот этой записи? Добавление объекта: r и p - идентификационные номера.(типа r=2006000001 и p=2006000002) thisform.o1.olecontrol3.Nodes.Add('1_'+transform(r)+'.'+TRANSFORM(p), 4, '1_'+transform(&k_id_tree)+'.'+transform(&k_id_parent), padr(ALLTRIM(GETWORDNUM(&k_famil,1,'-')),18,' ')+' '+DTOC(&k_dat_kontrl)+IIF(&k_podpis,' ! ',' ? ')+ALLTRIM(&k_nam_uzlov),0) Позиционирование в таблице: SELECT gurnal_xoz LOCATE FOR gurnal_xoz.id_gurnal_x=VAL(SUBSTR(Node.Key,3,AT('.',Node.Key)-3)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 13:17 |
|
||
|
TreeView
|
|||
|---|---|---|---|
|
#18+
Ну, так какие проблемы вместо LOCATE использовать SEEK() в случае существования индекса по полю id_gurnal_x Код: plaintext Здесь я предполагаю, что в таблице gurnal_xoz создан индекс по полю id_gurnal_x, который так и называется id_gurnal_x. Нагружать Key узла вспомогательной информацией нет никакой необходимости. Оставьте в значении Key только идентификатор записи таблицы. Всю вспомогательную информацию потом можно будет вытащить из найденной записи таблицы. Зато упростится процесс поиска нужного узла в дереве. Примерно так: Код: plaintext 1. 2. 3. 4. 5. Всю дополнительную информацию по узлу (если это необходимо), можно записать в свойство TAG узла. Это поле комментария. Оно никак не влияет на работу собственно TreeView. Код: plaintext 1. 2. 3. Но вообще-то, чем меньше информации хранится собственно в TreeView тем быстрее оно строится. Поскольку каждый лишний символ приходится грузить в память. Проще делать отдельный курсор, в который скидывать всю вспомогательную информацию по значению ключа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2006, 13:46 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=242&tid=1591066]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
41ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 357ms |

| 0 / 0 |
