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

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

Stack overflow [D7, IBX7.1]


Lavrenty ©   (2007-06-05 14:48:00) 

Здравствуйте мастера! Почему-то при закрытии программы появляется сообщение 'Stack overflow'


procedure TForm1.FormShow(Sender: TObject);
begin
 IBDB.Connected := true;
 IBT.StartTransaction;
 IBQ.Open;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if IBT.InTransaction then begin
   IBQ.DisableControls;
   IBQ.Close;
   IBT.Commit;
 end;
 IBT.StartTransaction;
 IBQ.Open;
 IBQ.EnableControls;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if IBT.InTransaction then
   try
     IBT.Commit;
   except
     IBT.Rollback;
     Application.MessageBox('Íå óäàëîñü çàâåðøèòü òðàíçàêöèþ IBT', 'Çàêðûòèå çàïðîñà',
                             MB_OK+MB_ICONWARNING);
   end;
 Form1.Close;
end;


Запрос вывожу в обычный грид.


Sergey13   (2007-06-06 08:23:00) [1]

> [10] Lavrenty ©   (05.06.07 17:24)
> Она примерно через 1ч - 1,5 ч выдаёт сообщение "Out of memory"

Что она при этом делает? Наверное активно пишет в открытый датасет?


tesseract   (2007-06-05 17:59:00) [2]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IBT.InTransaction then begin
  IBQ.DisableControls;
  IBQ.Close;
  IBT.Commit;
end;
IBT.StartTransaction;
IBQ.Open;
IBQ.EnableControls;
end;


Выключи-ка таймер при входе в эту процедуру, а то точно stack overflow гарантирован.


Lavrenty   (2007-06-05 17:24:00) [3]

Прошу прощения за timeout, не увидел, что тема перемещена в другую конференцию.
> Loginov Dmitry ©   (05.06.07 16:39) [9]
> Причина 'Stack overflow' еще интересует автора?

Нашёл причину.

> Sergey13 ©   (05.06.07 16:32) [7]


> Это нечто вроде мониторинга?А записи могут редактироваться?


> clickmaker ©   (05.06.07 16:35) [8]


> а транзакции-то зачем, если она только читает?

Всё немного сложнее. Есть программа, написанная не мной, но которую надо доделать. Она примерно через 1ч - 1,5 ч выдаёт сообщение "Out of memory" и дальше по таймеру "Transaction is active'  и всё тут. Стал разбираться и для начала сделал этот маленький сильно упрощённый модуль, но технология та же. В реальной программе запросов несколько, некоторые обновляются. Дальше не знаю, обсуждать или нет. Текст той программы доволно большой, выкладывать сюда наверное не стоит, а на словах описывать процесс работы - боюсь вас запутать. Так что если есть желание помочь отзовитесь.


Loginov Dmitry   (2007-06-05 16:39:00) [4]

Причина 'Stack overflow' еще интересует автора?


clickmaker   (2007-06-05 16:35:00) [5]


> Программа выводит на экран информацию, которую читает из
> базы

а транзакции-то зачем, если она только читает?


Sergey13   (2007-06-05 16:32:00) [6]

> [6] Lavrenty ©   (05.06.07 15:45)

Это нечто вроде мониторинга?

А записи могут редактироваться?


Lavrenty   (2007-06-05 15:45:00) [7]


> Sergey13


> Зачем? Сколько записей возвращает запрос? Что за задача?

Записей немного, от 5 до 20.  Программа выводит на экран информацию, которую читает из базы. База (соответствующие таблицы) может обновляться в любое время, и информация на табло должна быть свежей.


Sergey13   (2007-06-05 15:36:00) [8]

> [4] Lavrenty ©   (05.06.07 15:07)

Если переложить твой алгоритм транзакций на двери в помещении, то получится примерно следующее:
При появлении тебя около здания открываются все двери и по таймеру (не зависимо от наличия в дверном проеме человека) начинают все сразу громко хлопать (закрываясь-открываясь).

> мне надо обновлять данные в гриде через, предположим 1 минуту
Зачем? Сколько записей возвращает запрос? Что за задача?


Lavrenty   (2007-06-05 15:07:00) [9]

Читаю. Решил попробовать что-то сделать. Наверное порядок расположения методов неправильный, но мне надо обновлять данные в гриде через, предположим 1 минуту, может поэтому так получилось? В книгах так и пишут: StartTransaction-DataSet.Open-действия-DataSet.close-Commit. Вот я и написал.


Sergey13   (2007-06-05 15:00:00) [10]

> [2] Lavrenty ©   (05.06.07 14:57)
> А что не так?

Да все. От начала до конца.
Тебе бы книжку какую нибудь про БД почитать надо. Про базовые (в смысле основные) принципы.


Lavrenty   (2007-06-05 14:57:00) [11]

В этом деле новичок. А что не так?


Sergey13   (2007-06-05 14:55:00) [12]

Интересный подход к работе с транзакциями. Сам придумал?


Наверх

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