Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

ClientDataSet1.ApplyUpdates()   Найти похожие ветки 

 
K0nstantin   (2011-08-17 13:29) [0]

Привет Прогеры!!!
Возможно ли реализовать вызов  ClientDataSet1.ApplyUpdates()
в отдельном потоке?
(соединение клиента с сервером через DComConnection)
При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного.


 
sniknik ©   (2011-08-17 14:28) [1]

> При отправке изменений на сервер клиентское приложение подвисает. Может у кого есть пример подобного.
"подобного" сколько угодно, тут у каждого второго потоки виснут, (после Архангельского ?)... может хватит их плодить?


 
K0nstantin   (2011-08-18 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 ©   (2011-08-18 08:17) [3]

> как отобразить на экране длительный процесс обращения к БД при вызове ApplyUpDates.
длительный? ты что там результаты ввода/изменений всем отделом за месяц сбрасываешь?

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

ВСЕ должно быть в потоке, или через синхронизацию. частями как у тебя это бессмысленно.


 
k0nstantin   (2011-08-19 06:39) [4]

> во первых бессмысленно, закрыл, открыл и ничего не измененное сохранил...
Здесь перед закрытием можно сохранить данные на диск SaveToFile
Потом открыть с диска LoadFromFile

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

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

А может наоборот скрыть основную форму, и в отдельном потоке создать окно с TAnimate, показать пользователю и ждать пока не закончиться обновление данных в БД через синхронизацию.
Можно ли из потока окно создавать?


 
sniknik ©   (2011-08-19 08:15) [5]

> Здесь перед закрытием можно сохранить данные на диск SaveToFile
> Потом открыть с диска LoadFromFile
и зачем? сохранение на диск делается с той же скоростью что передача на сервер(если в локальной сети)... что выигрываешь? в 2 раза дольше + поток...

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

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

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

> Можно ли из потока окно создавать?
почему бы и нет? но опять таки, смотря как создавать, если просто взять и создать готовое vcl (форму) то см. выше про vcl.
т.е. теоретически можно, но лучше по правилу, - все создавать в самом потоке + визуального не использовать.


 
k0nstantin   (2011-08-19 08:49) [6]

Да вот заморочище получается
Благодарю за консультацию.

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

>т.е сам компонент набора данных тоже должен быть в потоке создан.


 
sniknik ©   (2011-08-19 09:29) [7]

> Вот в ADO есть метод отображения процеса OnFetchProgres, а в ClientDataSet нету.
и что мешает использовать его, вместо клиентского? он может все, за редким исключением, из того что может клиентский (вот если бы наоборот... то исключения стали бы правилом).


 
k0nstantin   (2011-08-20 05:31) [8]

Вот как раз изучаю ADO более подробно. На стороне сервера у меня компоненты доступа к наборам данных БД реализованы через ADO

Благодарю за грамотную консультацию!



Страницы: 1 вся ветка

Текущий архив: 2011.12.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1312943870
Максон
2011-08-10 06:37
2011.12.04
Реализация полного формата даты в отчете


2-1314022808
Mishanja
2011-08-22 18:20
2011.12.04
Формирование TreeView


15-1312810075
Leon-Z
2011-08-08 17:27
2011.12.04
Компоненты DB.


15-1313239099
>|<
2011-08-13 16:38
2011.12.04
Аномальный курсор


4-1252596453
harisma
2009-09-10 19:27
2011.12.04
PasswordChar для TEdit