Russian Qt Forum
Ноябрь 23, 2024, 03:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt + Firebird embedded, долгое завершение программы.  (Прочитано 14261 раз)
vregess
Гость
« : Декабрь 29, 2014, 12:33 »

После подключения к локальной БД программа завершается очень долго - несколько секунд.
qt 5.2.0, msvc 2010 x32, win7

Пробовал такие варианты:
* firebird 2.5.2, самосборный (чтобы использовать ICU51, как в qt)
* firebird 2.5.3, самосборный
* firebird 2.5.3, готовые библиотеки с сайта.

ibase драйвер собирался для каждой версии.
Даже если не подключатся к БД, а просто загрузить ibase драйвер, то завершается программа заметно медленнее, чем без драйвера.

main.cpp
Код
C++ (Qt)
#include <QApplication>
#include <QSqlDatabase>
#include <QFileInfo>
#include <QDir>
#include <QMessageBox>
#include <QTimer>
 
void run()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE", "myconnection1");
   if (!db.isValid())
   {
       QMessageBox::information(0, "msg", "fail");
       return;
   }
 
   QString path = QFileInfo(
       QApplication::applicationDirPath(), QString("test.fdb"))
       .absoluteFilePath();
 
   QString cfg = QLatin1String(
       "server type=Embedded; auto_commit=True; auto_commit_level=4096; "
       "connection lifetime=1; ISC_DPB_LC_CTYPE=UTF8; DataBase=\"%1\"");
 
   db.setUserName("SYSDBA");
   db.setPassword("masterkey");
   db.setConnectOptions(cfg.arg(path));
   db.setDatabaseName(path);
 
   if (!db.open())
   {
       QMessageBox::information(0, "msg", "db open fail");
       return;
   }
 
   QMessageBox::information(0, "msg", "ok");
}
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   run();
   QTimer::singleShot(0, &app, SLOT(quit()));
   return app.exec();
}
 

pro
Цитировать
TEMPLATE = app
QT += sql widgets
SOURCES += main.cpp

В чем может быть проблема? Или это нормальное поведение?
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Декабрь 29, 2014, 15:08 »

Тоже интересно.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
vregess
Гость
« Ответ #2 : Март 26, 2015, 10:09 »

Up.
Кто-нибудь решил проблему? Может с другим драйвером таких проблем нет?
Записан
vregess
Гость
« Ответ #3 : Март 26, 2015, 12:23 »

Проверил с raw C API - программа также завершается несколько секунд. Похоже проблема не на стороне Qt, а где-то у firebird, и связанно это именно с ebedded версией. Тот же FlameRobin нормально завершается.

Вот тут похожая проблема http://stackoverflow.com/questions/1512944/embedded-firebird-unload-delay, но я никаких событий не использую.
Тестовый код:
Код
C++ (Qt)
#include <iostream>
#include <ibase.h>
 
#define ERR_STATUS {res = 1; isc_print_status(status);}
 
isc_db_handle   db = NULL;
isc_tr_handle   trans = NULL;
ISC_STATUS_ARRAY status;
 
int main(int argc, char **argv)
{
   int res = 0;
 
   std::cout << "start" << std::endl;
 
   if (isc_attach_database(status, 0, "test.fdb", &db, 0, NULL))
   {
       isc_print_status(status);
       return 1;
   }
 
   if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
       ERR_STATUS
 
   if (isc_dsql_execute_immediate(status, &db, &trans, 0,
       "CREATE TABLE TEST(id INT)", 1, NULL))
       ERR_STATUS
 
   if (isc_commit_transaction(status, &trans))
       ERR_STATUS
 
   if (isc_detach_database(status, &db))
       ERR_STATUS
 
   std::cout << "end" << std::endl;
   return res;
}
 
Записан
Bepec
Гость
« Ответ #4 : Март 26, 2015, 12:33 »

Принудительно базу закрывать пробовали?
Записан
vregess
Гость
« Ответ #5 : Март 26, 2015, 12:34 »

Пробовали.
Записан
vlad-mal
Гость
« Ответ #6 : Февраль 15, 2016, 03:17 »

Решение.
Перед выгрзкой клиентской библиотеки (речь именно об embedded) следует вызвать функци. fb_shutdown этой самой библиотеки. С параметрами (0, 1) /например/.

Сигнатура функции:


   int fb_shutdown(unsigned int timeout,
                   const int reason);

stdcall, а еще следует указать имя dll.
Записан
vregess
Гость
« Ответ #7 : Февраль 15, 2016, 06:26 »

Жалко, уже не проверить - заменил на sqlite (пришлось помудохаться с многопоточностью). При возможности проверю, спасибо.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #8 : Февраль 15, 2016, 14:08 »

Мерси!
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Пытон
Гость
« Ответ #9 : Февраль 13, 2017, 08:00 »

Жалко, уже не проверить - заменил на sqlite (пришлось помудохаться с многопоточностью). При возможности проверю, спасибо.

Как вы там живёте на SQLite без decimal?
Записан
vregess
Гость
« Ответ #10 : Февраль 13, 2017, 08:59 »

Как вы там живёте на SQLite без decimal?

Нормально живем, более того мы еще и без SQLite можем жить, если ты понимаешь о чем я.
Записан
Пытон
Гость
« Ответ #11 : Февраль 13, 2017, 11:20 »

Как вы там живёте на SQLite без decimal?

Нормально живем, более того мы еще и без SQLite можем жить, если ты понимаешь о чем я.

Денюжки (числа с фиксированной дробной частью) в sqlite не хранишь?
Записан
vregess
Гость
« Ответ #12 : Февраль 13, 2017, 11:29 »

Денюжки

Да
Записан
Пытон
Гость
« Ответ #13 : Февраль 13, 2017, 11:35 »

Что - да? Да, не храню? Или - да, храню?
Записан
vregess
Гость
« Ответ #14 : Февраль 13, 2017, 13:06 »

Что - да? Да, не храню? Или - да, храню?

Да, не храню.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 23.