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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем vector, 25 авг 2006.

Статус темы:
Закрыта.
  1. vector

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

    Может кто сталкивался, подскажите пожалуйста.
    С уважение Роман.
     
  2. vector

    vector Гость

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

Поделиться этой страницей