• Бесплатный ВЕБИНАР по OSINT с Екатериной Тьюринг: ➡️9 февраля в 19:00 (мск) пройдет урок

    Как безопасно искать информацию в открытых источниках

    🔥 Записаться 🔥

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

  • Автор темы Автор темы vector
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
V

vector

Приветствую всех форумчан.
(Использую 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 из-за того, что компьютер был "слабее".
Даже мыслей не возникает почему такое может происходить.

Может кто сталкивался, подскажите пожалуйста.
С уважение Роман.
 
Вопрос решился.
Проблема была в том, что я изменил область видимости для члена класса Items на Private.
Т.е. скрыл его от других.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!