Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с Sqlite в Qt 
:(
    Опции темы
Finalist
Дата 24.8.2010, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.5.2006

Репутация: нет
Всего: 1



Здравствуйте!

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

и есть небольшая проблема..  при периодическом сигнале (онлайн скан) oScaned(QList<QStringList>) из второстепенного потока, где-то после круга 5го или 6го выскакивает ошибка базы... "SQlError online scanned: unable to open database file Unable to execute statement"
все 5 или 6 кругов все данные добросовестно пишутся в базу.. а потом ломается... 
всю реализацию сделал в классе worker, он создает потоки, и он же принимает сигналы от них. база открывается и используется только в нем.
все методы, где я юзаю базу данных, защищены мютексом. 
пропускал через valgrind --leak-check=full --show-reachable=yes --track-origins=yes  ./parser
в том месте где происходит сбой ругается чета типа : invalid descriptor in syscall open();
куда девается дескриптор - непонятно) smile 

(Linux ubuntu, Qt Creator 2.0.0 Основан на Qt 4.7.0 (32-х битной))
Скачал с сайта qt.nokia.com в версии qt не уверен.

вот слот который принимает данные из потока:
Код

void worker::oScaned(QList<QStringList> l)
{
    QSqlDatabase db = createConnection();
    QMutexLocker locker(&msql);
    QSqlQuery query(db);
    // clean online table;
    query.exec("delete from online where whn < (strftime('%s','now') - 60 * 15)");

    foreach (QStringList sl, l)
    {
        if (QString("login error").compare(sl.at(0)) != 0 && sl.length() == 3)
        {
            QString q = "select mid from online where mid='"+sl.at(0)+"'";
            query.exec(q);
            if (!query.next())
            {
                query.exec("insert into online(mid, name, messid, whn) values('"+sl.at(0)+"', '"+sl.at(1)+"', '"+sl.at(2)+"', strftime('%s','now'))");
                // SELECT datetime(1280532436, 'unixepoch', 'localtime');SELECT strftime('%s','now');
                QSqlError err = query.lastError();
                if (err.isValid())
                {
                    emit error_set("SQlError online scanned: " + err.text());
                    //SQlError online scanned: unable to open database file Unable to execute statement
                }
            }
        }
    }
    db.close();
}


теперь функция  createConnection();

Код

QSqlDatabase& worker::createConnection()
{
    QMutexLocker locker(&msql);
    static QSqlDatabase db;
    if(!db.isValid())
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("basebase.db");
        if (!db.open()) {
            QMessageBox::critical(0, qApp->tr("Cannot open database"),
                qApp->tr("Unable to establish a database connection.\n"
                         "This example needs SQLite support. Please read "
                         "the Qt SQL driver documentation for information how "
                         "to build it.\n\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);
            return NULL;
        }
    }
    if (!db.isOpen())
    {
        db.open();
    }
    return db;
}


и еще одна какая нибудь с базой для примера.. таймер основной формы откуда выводится колво юзеров онлайн на lcd дийплей.
Код

void worker::timerOut()
{
    QSqlDatabase db = createConnection();
    QMutexLocker locker(&msql);
    QSqlQuery query(db);
    query.exec("select count(*) from online");
    while (query.next())
    {
        int i = query.value(0).toInt();
        emit lcd_set(i);
    }
    db.close();
}



Хотелось бы услышать что-то по поводу использования базы в резидентных программах. в скриптах не сложно - открыл закрыл.. а тут думать нада когда открыть, когда закрыть. нужно ли ресурсы освобождать? в общем как использовать базу  оптимальнее всего. 
PM MAIL   Вверх
bsa
Дата 24.8.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



А почему нельзя открыть базу только один раз при запуске программы, а закрыть при завершении?
PM   Вверх
Finalist
Дата 24.8.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.5.2006

Репутация: нет
Всего: 1



таки да, убрал закрытие базы каждый раз, и вроде ужепол часа как крутится, и нормально. 
я просто думал лучше закрывать базу во время простоя проги. ну нет, так нет) главное чтоб работало
спс! буду пока тестить...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.