Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1313471235
Xmen
2011-08-16 09:07
2011.12.04
Интерфейс не поддерживается.


2-1313613139
2012
2011-08-18 00:32
2011.12.04
Как получить название месяца и дня недели из текущей даты?


2-1313560814
Oleg_teacher
2011-08-17 10:00
2011.12.04
Взаимодействие ворд+делфи


15-1312961375
Antoxa
2011-08-10 11:29
2011.12.04
Нужен генератор отчетов для Rad Studio 2010


15-1313059279
Palladin
2011-08-11 14:41
2011.12.04
FireMonkey





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский