Виталий Пухов: @lam0x86: а что, если заполнять из главного потока с использованием какого либо бэйсиковского подобия DoEvents шарпе, а данные читать из другого потока? То есть соорудить событие на изменение данных. Ну, чисто теоретически. Я б проверил на практике, но практики у меня не так много, чтобы быстро это реализовать.
я понимаю, что блокирует. На самом деле задача немного иная. Дерево заполняется из базы. Сначала создаются пустые итемы по количестве записей, потом по необходимости заполняются (при раскрытии узла, например). Так вот хотелось бы, чтобы все было гладко, чтобы форма не дергалась в этот момент и прокрутка не дергалась и раскрытию уже загруженных узлов это не мешало. Как это можно осуществить?
AxisPod: это какой то кошмар. Почему на такую задачу нет паттерна? Неужели мне одному потребовалось отобразить большой объем информации в дереве, беспокоясь при этом об удобстве пользователя? ((
AxisPod: а, ну в целом суть ясна, только как осуществить это с деревом я не врубаюсь. Чтобы отобразить в ЛистБоксе, как предложенно в статье, нужно высоту листбокса разделить на высоту одного итема. Ну допустим их величина разная. Далее я просто подгружаю нужные итемы по порядковому номеру и все. Но с деревом то как?
суть сего в том, что данные будут каждый раз читаться из базы данных, когда я бегаю по полосе прокрутки? Если бы это была локальная база данных или XML, то без проблем, но не посадит ли такой подход SQL сервер?
Я хотел, чтобы дерево заполнилось пустыми итемами и на них повешалось событие, которое бы считывало их с базы по ходу дела, а встроенная виртуализация компонента хранила бы в памяти данные, но подтирала сами компоненты вне зоны видимости. Виртуализация с этим справляется, памяти используется на порядок меньше и меня бы устроило даже сразу загрузить все дерево, но это сильно замедляет запуск приложения. Зачем грузить сразу те итемы, которые останутся без моего внимания?
Nipheris: таки да, в с++ были события. По крайней мере если в той же студии создать новый проект на с++, то там будет возможность создавать события. Причем таким же образом, через делегаты. Только на нулл проверять не требуется. Да даже в бейсике есть. Только там вообще не нужно определять никакие делегаты, видимо среда это делает за нас. В общем то это логично, зачем каждый раз писать лишние одинаковые строки? )
Да да, про try я в курсе, просто я не знал как и где мне отловить ошибку, на которую не ругается дебаггер.
в с++ такого не было. Ну да ладно, надо, так надо. Посоветуйте тогда как грамотнее (правильнее) будет делать проверку на подписку? Через try{}? Есть ли более быстрый (с точки зрения времени выполнения) способ?
не понял. зачем быть подписанным на событие? У многих классов и компонентов есть события, на которые никто не подписан, которые не обрабатываются программой. Или я чего то не правильно понял? (
(Интернет)---(АДСЛ модем)---(файрвол > 192.168.203.150/17)---(192.168.203.1 < контроллер домена, шлюз > 192.168.0.0/17)---(тут же все рабочие станции)---(192.168.100.1/17 < DSR-1000N > 10.73.51.145)---(сеть головного предприятия, через которую организован VPN)---(10.73.54.22 < DSR-150N > 192.168.241.1)---(наша подсеть)