Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FIBDataSet.RollBack


DelphiLexx ©   (2007-05-25 11:38:00) 

FibDataSet.Rollback вызывает функции isc_rollback_transaction из библиотеке fbclient.dll для Firebird'a 1.5>0. Есть у меня проблемка с этим RollBack'ом. Дело в том, что в OnDestroy формы у меня вызывается RollBack или Commit в зависимости от того выбрал пользователоь отменить или сохранить данные. Так RollBack выполнятся несколько если БД сетевая т.е. БД располается на одном компе, а юзер на другом. Так вот, когда пользователь нажимает не сохранять данные, дочерняя (у меня MDI приложение) форма закрывается, а затем вызывается OnDestroy и соответственно RollBack, который выполняется несколько секунд. Если сразу после закрытия дочерней формы попыться закрыть главную форму возникает ошибка, это происходит из-за того, что RollBack еще не завершился, а мы пытаемся закрыть приложение.
Ошибку см. рис.


Interior   (2007-06-10 22:18:00) [1]

;-)


Сергей М.   (2007-06-06 15:01:00) [2]


> Что за прощальное сообщение


"Аминь !"


DelphiLexx   (2007-06-06 10:48:00) [3]


> Решил в лоб: при закрытии выводил MessageBox("Прощальное
> сообщение");с кнопкой Ok.

Что за прощальное сообщение


Interior   (2007-06-04 12:06:00) [4]

В общем надо как-то узнать завершился роллбэк или нет.
Была похожая проблема.
Решил в лоб: при закрытии выводил MessageBox("Прощальное сообщение");
с кнопкой Ok.
После ее нажатия все закрывалось тихо и мирно. Видимо времени хватало на завершение.


DelphiLexx   (2007-05-28 18:09:00) [5]


> Естественно если не созданны дополнительные потоки.

Нет у меня дополнительных потоков.


atruhin   (2007-05-28 16:59:00) [6]

> [6] DelphiLexx ©   (28.05.07 09:59)
> но сообщение на закрытие формы было поставлено на очередь,

Ерунду городишь. Ищи ошибку в своем коде.
> здесь помимо RollBack'a выполняется еще некоторый код

Ни кто не может выполняться помимо RollBack'a. Естественно если не созданны дополнительные потоки.


DelphiLexx   (2007-05-28 13:37:00) [7]


> Application.ProcessMessages

Так он у меня и не стоит


ЮЮ   (2007-05-28 10:38:00) [8]

так вот вместо того чтобы выполнялся этот код обработается сообщение wm_close MainForm

Чтобы этого не происходило не надо ставить где попало Application.ProcessMessages.


DelphiLexx   (2007-05-28 09:59:00) [9]


> Как можно закрыть главное окно, пока она выполняется?

Я так понимаю, окно на самом деле не закрывается пока выполняется RollBack, но сообщение на закрытие формы было поставлено на очередь, поэтому получается такая ситуация:
procedure TMyForm.OnDestroy(Sender: TObject);
begin
...
 {идёт выполнение RollBack'a}
 code R'llBack'a
 begin
   1...
   2...
   3...  
   ...
   {за счет того, что я нажимаю на крестик Main формы происходит посылка
    соощения wm_close, и сообщение становится в очередь.}
   ...
   n
 end;
...
{здесь помимо RollBack'a выполняется еще некоторый код, так вот вместо того чтобы выполнялся этот код обработается сообщение wm_close MainForm т.е. когда мы окажемся здесь, то вызывается ошибка т.к. уже не существует MainForm}
...
end;


atruhin   (2007-05-25 21:48:00) [10]

> FibDataSet.Rollback

Вроде это синхронная функция? Как можно закрыть главное окно, пока она выполняется?


Johnmen   (2007-05-25 21:08:00) [11]


> При чем здесь Fib'овский код - ошибка происходит из - за
> несинхронности

Да ты всё знаешь!
К чему тогда эти глупые проблемы?


DelphiLexx   (2007-05-25 20:46:00) [12]


> Это происходит, ИМХО, по другим причинам, которые сокрыты
> в твоём (или Fib-овском) коде

При чем здесь Fib'овский код - ошибка происходит из - за несинхронности т.е. RollBack еще не завершился а мы пытаемся закрыть приложение. Поэтому нужно как-то синхронизировать т.е не давать пользователю куда-либо кликать пока идет откат.


ЮЮ   (2007-05-25 12:03:00) [13]

> Если сразу после закрытия дочерней формы попыться закрыть
> главную форму возникает ошибка, это происходит из-за того,
> что RollBack еще не завершился, а мы пытаемся закрыть приложение

Это происходит, ИМХО, по другим причинам, которые сокрыты в твоём (или Fib-овском) коде и выясняется только отладчиком, ибо телепеторы так далеко не видят


Johnmen   (2007-05-25 11:50:00) [14]

Печальная история.... Пеши исчо.

ЗЫ Картинка тута
http://sql.ru/forum/actualthread.aspx?tid=433293


Наверх

Титульная страница Поиск, карта сайта Написать письмо