Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обновление TTreeView из потока

20K
25 августа 2006 года
xroot
2 / / 25.08.2006
Приветствую всех форумчан.
(Использую C++Builder 6.0 SP4)
Пишу компоненту, которая работает с TTreeView (заполняет, обновляет дерево из базы данных).
Данная компонента имеет дополнительный поток, который проверяет изменения в базе данных
и вносит их в дерево.
Практически все реализовал, но столкнулся с проблемой, к которой даже не знаю как подступиться.
К одной базе может быть подлючено несколько пользователей, которые редактируют дерево.
Изменения, внесенный в дерево одним пользователем, будут отображены в программах других
пользователей автоматически с помощью потока в компоненте дерева.
Но если пользователь удаляет узел дерева, почему-то после этого при переборе узлов дерева
в потоке при обращении к определенному узлу возникает исключительная ситуация в модуле
vcl60.bpl.
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 40132B7B in module 'vcl60.bpl'. Read of address 00001BE4'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Вот в этой строке:

 
Код:
TTreeNode* node;
...
    node=treeview->Items->Item;  - вот в этой строке



При этом индекс i=0 и один узел в дереве действительно есть.

После этого поток прекращает выполняться, даже если заключить даныый код в try...catch.
Код этот выполняется в методе потока, который вызывается из метола потока Execute()
с помощью Synchronize(MethodX);

Чего я только не пробовал, останавливал выполнение потока перед удаением пользователем
узла, а потом снова запускал (Suspend(), Resume()), создавал критическую секцию,
захватывал ей метод, где удаляется пользователем узел, затем освобождал.
Короче ничего не помогает. Самое интересное, что treeview->Items->Count
возвращает правильное количество узлов, а следом попытка обратиться к первому узлу дает
вот такое исключение.

Также я не могу объяснить странный эффект исчезновения ошибки при увеличении задержки в потоке (в ф-цииExecute()) после полной проверки дерева и БД перед новым циклом проверки.
При увеличении задержк более чем на 5000мс (на моем компьютере)
исключение исчезало!!! На другом компьютере время пришлось увеличить до 10000 из-за того, что компьютер был "слабее".
Даже мыслей не возникает почему такое может происходить.

Может кто сталкивался, подскажите пожалуйста.
С уважение Роман.
20K
25 августа 2006 года
xroot
2 / / 25.08.2006
В своем компоненте TSmrtDBTreeView я спрятал Items (TTreeNodes*) из родителя TCustomTreeView* в секцию с видимостью private.
После того как убрал, ошибка вроде исчезла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог