![]() |
Модераторы: Akella |
![]() ![]() ![]() |
|
ksili |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Даже не знаю, куда написать, сюда, в C++Builder или ещё куда...
Пишу программу на C++Builder с использованием FIBPlus. В программе несколько дочерних потоков. Каждый работает с БД. В каждом динамически создаются необходимые для работы с БД компоненты (как правило, один TpFIBDatabase, один TpFIBQuery и несколько TpFIBTransaction). Периодически возникают ошибки при работе с БД. Я эти ошибки ловлю компонентой pFIBErrorHandler и сохраняю в файл сообщения об ошибке. Сообщения абсолютно бредовые, я весь код перерыл, явно нигде такой чуши послаться серверу БД не могло. Вот пара сообщений:
Было также замечено, что ошибки возникают только когда отключено журналирование SQL-запросов! Журналирую так: для события BeforeExecute каждой квери назначаю обработчик:
All_ch - указатель на глобальную структуру в основном потоке All_ch->chnls[this_ch] - обращение к структуре описания одного потока (каждый поток вроде обращается только к "своей" строке в этом массиве структур All_ch->chnls[this_ch].log - это собственно указатель на компонент TJvLogFile для ведения журнала (у каждого потока свой журнал) Самое интересное, что косяки происходят при выключенном журналировании! (оно отключается сразу для всех потоков). То есть когда дальше первой строки в функции SQLlogging_1 не уходит. Из-за этого и поймать эти ошибки не получается Поскольку сообщения об ошибках всегда разные, думаю, что это из-за многопоточности... кто-то куда-то лезет куда-не надо и повреждает текст запроса. Но как найти где это происходит? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||||
|
|||||||||
jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: 1 Всего: 20 |
скорее всего это происходит из-за рассинхронизации потоков, проверь код, определи критические секции (создание, использование освобождение компонентов), используй синхронизацию, может быть можно где-то вставить семафоры и т.д.
-------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Ну это всё понятно... слишком уж широкий совет.
Просто мистика какая-то: глючит, когда журналирование отключено, а не наоборот. Было бы это только при включенном журналировании,было б понятно, что надо искать косяк в работе с журналом. Я вообще в Билдере использую стандартный класс для потоков TThread. Критические секции и семафора никогда не использовал. Вопрос на засыпку: надо ли обращение из дочернего потока к глобальной структуре в основном потоке запихивать в Synchronize (ну или в критическую секцию)? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Interbase" | |
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |