Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1181246808
koha
2007-06-08 00:06
2007.07.01
Как узнать сколько раз процесс подключался к процессору?


2-1181331609
novice
2007-06-08 23:40
2007.07.01
SrollBox и Image


3-1175757826
derm
2007-04-05 11:23
2007.07.01
ADO кодировка


2-1181221488
Magedon
2007-06-07 17:04
2007.07.01
Регистрация DLL


2-1181222393
Bullfrog
2007-06-07 17:19
2007.07.01
TreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский