TTreeNode* node;
...
node=treeview->Items->Item; - вот в этой строке
Обновление TTreeView из потока
(Использую 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
---------------------------
Вот в этой строке:
Код:
При этом индекс i=0 и один узел в дереве действительно есть.
После этого поток прекращает выполняться, даже если заключить даныый код в try...catch.
Код этот выполняется в методе потока, который вызывается из метола потока Execute()
с помощью Synchronize(MethodX);
Чего я только не пробовал, останавливал выполнение потока перед удаением пользователем
узла, а потом снова запускал (Suspend(), Resume()), создавал критическую секцию,
захватывал ей метод, где удаляется пользователем узел, затем освобождал.
Короче ничего не помогает. Самое интересное, что treeview->Items->Count
возвращает правильное количество узлов, а следом попытка обратиться к первому узлу дает
вот такое исключение.
Также я не могу объяснить странный эффект исчезновения ошибки при увеличении задержки в потоке (в ф-цииExecute()) после полной проверки дерева и БД перед новым циклом проверки.
При увеличении задержк более чем на 5000мс (на моем компьютере)
исключение исчезало!!! На другом компьютере время пришлось увеличить до 10000 из-за того, что компьютер был "слабее".
Даже мыслей не возникает почему такое может происходить.
Может кто сталкивался, подскажите пожалуйста.
С уважение Роман.
После того как убрал, ошибка вроде исчезла.