Конференция "Начинающим" » ClientDataSet1.ApplyUpdates()
 
  • K0nstantin (17.08.11 13:29) [0]
    Привет Прогеры!!!
    Возможно ли реализовать вызов  ClientDataSet1.ApplyUpdates()
    в отдельном потоке?
    (соединение клиента с сервером через DComConnection)
    При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного.
  • sniknik © (17.08.11 14:28) [1]
    > При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного.
    "подобного" сколько угодно, тут у каждого второго потоки виснут, (после Архангельского ?)... может хватит их плодить?
  • K0nstantin (18.08.11 07:43) [2]
    Прога работает нормально, уже полгода  облегчает рутинный труд нескольких человек.
    Я вот про то как отобразить на экране длительный процесс обращения к БД при вызове ApplyUpDates. А то после нажатия СОХРАНИТЬ НА СЕРВЕР прога замирает до окончания процесса сохранения данных.
    Вот хотелось бы повесить мультик (TAnimate) или ProgresBar но не могу догнать как это правильно сделать именно в случае работы с БД.

    Вот например такой код не вызовет глюков случаем
    (первый раз подобное пытаюсь реализовать)

    procedure TNewThread.Execute;
    begin
    inherited;
    CoInitialize(nil);
    Synchronize(SetBegin);
    DCOMCON:=TDCOMConnection.Create(nil);
    SetConOptions;
    dm.cdsPersonal.Active:=False;
    DM.cdsPersonal.RemoteServer:=DCOMCON;
    dm.cdsPersonal.Active:=true;
    try
    DCOMCon.Open;
    finally

    end;
    if DCOMCON.Connected then
       BEGIN
        DM.cdsPersonal.ApplyUpdates(-1);
       END
    else Synchronize(SetError);
    if DCOMCON.Connected then DCOMCON.Close;
    DCOMCON.Free;
    Synchronize(SetEnd);
    CoUninitialize();
    end;

    SetBegin, SetError и SetEnd чисто для синхронизации с содержимым формы
    cdsPersonal - это TClientDataSet
    SetconOptions - задает параметры подключения
    procedure TNewThread.SetConOptions;
    begin
    with DCOMCON do
      begin
       ServerGUID:=Dm.DCOMConnection.ServerGUID;
       ServerName:=Dm.DCOMConnection.ServerName;
       ComputerName:=Dm.DCOMConnection.ComputerName;
       LoginPrompt:=Dm.DCOMConnection.LoginPrompt;
      end;

    end;

    Так вот правильно ли это.
    1) Можно ли в потоке таким образом создать подлючение к БД
    2) Вызвать UpplyUpdates
    3) уничтожить подключение
  • sniknik © (18.08.11 08:17) [3]
    > как отобразить на экране длительный процесс обращения к БД при вызове ApplyUpDates.
    длительный? ты что там результаты ввода/изменений всем отделом за месяц сбрасываешь?

    > Так вот правильно ли это.
    нет конечно.
    во первых бессмысленно, закрыл, открыл и ничего не измененное сохранил...
    во вторых прямое обращение к vcl объекту из потока (внешнему по отношению к нему). у этого объекта могут быть обработчики и т.д.

    ВСЕ должно быть в потоке, или через синхронизацию. частями как у тебя это бессмысленно.
  • k0nstantin (19.08.11 06:39) [4]
    > во первых бессмысленно, закрыл, открыл и ничего не измененное сохранил...
    Здесь перед закрытием можно сохранить данные на диск SaveToFile
    Потом открыть с диска LoadFromFile

    >ты что там результаты ввода/изменений всем отделом за месяц сбрасываешь?
    работают с базой около 20 человек большинство из которых не имеют подключения к сети (Гос учреждение). Поэтому я реализовал Brifcase модель.
    Пользователи могут выгрузить данные на флешку и работать автономно.
    Вот поэтому много данных потом приходится передавать методом UpplyUpdates.
    да и таблиц много в БД около 30.
    Ошибки согласования обрабатываются OnReconcileError.
    > ВСЕ должно быть в потоке, или через синхронизацию. частями как у тебя это бессмысленно.

    само подключение в потоке создано
    DM.cdsPersonal.ApplyUpdates(-1); - нужно через синхронизацию вызывать?
    Так то да есть обработчики, тот же OnReconcileError

    А может наоборот скрыть основную форму, и в отдельном потоке создать окно с TAnimate, показать пользователю и ждать пока не закончиться обновление данных в БД через синхронизацию.
    Можно ли из потока окно создавать?
  • sniknik © (19.08.11 08:15) [5]
    > Здесь перед закрытием можно сохранить данные на диск SaveToFile
    > Потом открыть с диска LoadFromFile
    и зачем? сохранение на диск делается с той же скоростью что передача на сервер(если в локальной сети)... что выигрываешь? в 2 раза дольше + поток...

    > само подключение в потоке создано
    а должно быть "ВСЕ" используемое.

    > DM.cdsPersonal.ApplyUpdates(-1); - нужно через синхронизацию вызывать?
    обязательно...
    не, можно придумать исключения, типа никто кроме потока с ним не работает, и "завязок" на vcl нет. но..., лучше не рисковать. потому что "завязки" не только ты делаешь. ну и СОМ модель подразумевает инициализацию строго для потока, и если клиентский к ней относится (не в курсе, я все больше с ADO, а он точно относится), ...
    короче его тоже нужно создавать в потоке.
    > тот же OnReconcileError
    метод пофигу, код не "потоко зависим", если в нем конечно обращений "не туда" нет.
    аналогично, лучше в потоке.

    > А может наоборот скрыть основную форму,
    глупо. пока у тебя "проблемка",  но со сменой подхода на это, будет "ПРОБЛЕМИЩЕ".

    > Можно ли из потока окно создавать?
    почему бы и нет? но опять таки, смотря как создавать, если просто взять и создать готовое vcl (форму) то см. выше про vcl.
    т.е. теоретически можно, но лучше по правилу, - все создавать в самом потоке + визуального не использовать.
  • k0nstantin (19.08.11 08:49) [6]
    Да вот заморочище получается
    Благодарю за консультацию.

    Вот в ADO есть метод отображения процеса OnFetchProgres, а в ClientDataSet нету.

    >т.е сам компонент набора данных тоже должен быть в потоке создан.
  • sniknik © (19.08.11 09:29) [7]
    > Вот в ADO есть метод отображения процеса OnFetchProgres, а в ClientDataSet нету.
    и что мешает использовать его, вместо клиентского? он может все, за редким исключением, из того что может клиентский (вот если бы наоборот... то исключения стали бы правилом).
  • k0nstantin (20.08.11 05:31) [8]
    Вот как раз изучаю ADO более подробно. На стороне сервера у меня компоненты доступа к наборам данных БД реализованы через ADO

    Благодарю за грамотную консультацию!
 
Конференция "Начинающим" » ClientDataSet1.ApplyUpdates()
Есть новые Нет новых   [134431   +13][b:0][p:0]