Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c