-
Привет Прогеры!!! Возможно ли реализовать вызов ClientDataSet1.ApplyUpdates() в отдельном потоке? (соединение клиента с сервером через DComConnection) При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного.
-
> При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного. "подобного" сколько угодно, тут у каждого второго потоки виснут, (после Архангельского ?)... может хватит их плодить?
-
Прога работает нормально, уже полгода облегчает рутинный труд нескольких человек. Я вот про то как отобразить на экране длительный процесс обращения к БД при вызове 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) уничтожить подключение
-
> как отобразить на экране длительный процесс обращения к БД при вызове ApplyUpDates. длительный? ты что там результаты ввода/изменений всем отделом за месяц сбрасываешь?
> Так вот правильно ли это. нет конечно. во первых бессмысленно, закрыл, открыл и ничего не измененное сохранил... во вторых прямое обращение к vcl объекту из потока (внешнему по отношению к нему). у этого объекта могут быть обработчики и т.д.
ВСЕ должно быть в потоке, или через синхронизацию. частями как у тебя это бессмысленно.
-
> во первых бессмысленно, закрыл, открыл и ничего не измененное сохранил... Здесь перед закрытием можно сохранить данные на диск SaveToFile Потом открыть с диска LoadFromFile
>ты что там результаты ввода/изменений всем отделом за месяц сбрасываешь? работают с базой около 20 человек большинство из которых не имеют подключения к сети (Гос учреждение). Поэтому я реализовал Brifcase модель. Пользователи могут выгрузить данные на флешку и работать автономно. Вот поэтому много данных потом приходится передавать методом UpplyUpdates. да и таблиц много в БД около 30. Ошибки согласования обрабатываются OnReconcileError. > ВСЕ должно быть в потоке, или через синхронизацию. частями как у тебя это бессмысленно.
само подключение в потоке создано DM.cdsPersonal.ApplyUpdates(-1); - нужно через синхронизацию вызывать? Так то да есть обработчики, тот же OnReconcileError
А может наоборот скрыть основную форму, и в отдельном потоке создать окно с TAnimate, показать пользователю и ждать пока не закончиться обновление данных в БД через синхронизацию. Можно ли из потока окно создавать?
-
> Здесь перед закрытием можно сохранить данные на диск SaveToFile > Потом открыть с диска LoadFromFile и зачем? сохранение на диск делается с той же скоростью что передача на сервер(если в локальной сети)... что выигрываешь? в 2 раза дольше + поток...
> само подключение в потоке создано а должно быть "ВСЕ" используемое.
> DM.cdsPersonal.ApplyUpdates(-1); - нужно через синхронизацию вызывать? обязательно... не, можно придумать исключения, типа никто кроме потока с ним не работает, и "завязок" на vcl нет. но..., лучше не рисковать. потому что "завязки" не только ты делаешь. ну и СОМ модель подразумевает инициализацию строго для потока, и если клиентский к ней относится (не в курсе, я все больше с ADO, а он точно относится), ... короче его тоже нужно создавать в потоке. > тот же OnReconcileError метод пофигу, код не "потоко зависим", если в нем конечно обращений "не туда" нет. аналогично, лучше в потоке.
> А может наоборот скрыть основную форму, глупо. пока у тебя "проблемка", но со сменой подхода на это, будет "ПРОБЛЕМИЩЕ".
> Можно ли из потока окно создавать? почему бы и нет? но опять таки, смотря как создавать, если просто взять и создать готовое vcl (форму) то см. выше про vcl. т.е. теоретически можно, но лучше по правилу, - все создавать в самом потоке + визуального не использовать.
-
Да вот заморочище получается Благодарю за консультацию.
Вот в ADO есть метод отображения процеса OnFetchProgres, а в ClientDataSet нету.
>т.е сам компонент набора данных тоже должен быть в потоке создан.
-
> Вот в ADO есть метод отображения процеса OnFetchProgres, а в ClientDataSet нету. и что мешает использовать его, вместо клиентского? он может все, за редким исключением, из того что может клиентский (вот если бы наоборот... то исключения стали бы правилом).
-
Вот как раз изучаю ADO более подробно. На стороне сервера у меня компоненты доступа к наборам данных БД реализованы через ADO
Благодарю за грамотную консультацию!
|