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

Вниз

Stack overflow   Найти похожие ветки 

 
Lavrenty ©   (2007-06-05 14:48) [0]

Здравствуйте мастера! Почему-то при закрытии программы появляется сообщение "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-05 14:55) [1]

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


 
Lavrenty ©   (2007-06-05 14:57) [2]

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


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

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

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


 
Lavrenty ©   (2007-06-05 15:07) [4]

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


 
Sergey13 ©   (2007-06-05 15:36) [5]

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

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

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


 
Lavrenty ©   (2007-06-05 15:45) [6]


> Sergey13


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

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


 
Sergey13 ©   (2007-06-05 16:32) [7]

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

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

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


 
clickmaker ©   (2007-06-05 16:35) [8]


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

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


 
Loginov Dmitry ©   (2007-06-05 16:39) [9]

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


 
Lavrenty ©   (2007-06-05 17:24) [10]

Прошу прощения за 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"  и всё тут. Стал разбираться и для начала сделал этот маленький сильно упрощённый модуль, но технология та же. В реальной программе запросов несколько, некоторые обновляются. Дальше не знаю, обсуждать или нет. Текст той программы доволно большой, выкладывать сюда наверное не стоит, а на словах описывать процесс работы - боюсь вас запутать. Так что если есть желание помочь отзовитесь.


 
tesseract ©   (2007-06-05 17:59) [11]


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 гарантирован.


 
Sergey13 ©   (2007-06-06 08:23) [12]

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
3-1176115976
MadButcher
2007-04-09 14:52
2007.07.01
"зависание" Delphi 7


15-1180624372
Bogdan1024
2007-05-31 19:12
2007.07.01
Диск на 30 дней


2-1181130039
dr_craigan
2007-06-06 15:40
2007.07.01
работа с файлами


2-1181260861
Solbon
2007-06-08 04:01
2007.07.01
ftp


6-1165408740
Квэнди
2006-12-06 15:39
2007.07.01
IDTCPServer и Ip адрес клиента