Russian Qt Forum

Qt => Базы данных => Тема начата: bez_glaz от Февраль 27, 2012, 13:11



Название: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 13:11
Добрый день.
В общем суть такова.
Простецкое приложение.Есть форма авторизации, которая должна коннектиться к БД в PG под определённой ролью, исходя из введённых логина и пароля.
Есть класс connect в нём в private объявлена переменная
Код:
QSqlDatabase db;
в конструкторе пишу
Код:
    db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("test");
Первоначально по умолчанию происходит коннект под ролью test, потом исходя из введённых данных идёт сверка с записями в таблице БД, и осуществляется
Код:
        db.close();
        if (role)
        {
            db.setUserName(...);
            db.setPassword(...);
        }
        else
        {
            db.setUserName(...);
            db.setPassword(...);
        }
    if (db.open())
    {
        qDebug() << "NORM CONNECT" << db.userName();
    }
    else
    {
        qCritical() << db.lastError();
    } 

Всё работает более чем успешно, НО ...
При закрытии приложения пишет Варнинг
Код:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
В диструкторе я connect я пишу
Код:
Connect::~Connect()
{
    db.close();
    db.removeDatabase("QPSQL");
}
Что не так ???
Или может как-то вызывать отсоединения в диструкторе формы ??


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 13:13
а объект класса Connect уничтожается?


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 13:49
а объект класса Connect уничтожается?
Хмм... немножко зашёл в тупик. Я в main пишу
Код:
  Autorization * atr = new Autorization();

    Connect * first_connect = new Connect();
Какие механизмы происходят при закрытии формы ???
Вызывается ли её диструктор ???В отладке не стопится брейк поинт в диструкторе формы.


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 13:51
Autorization это форма?
Родителей у объектов не видать, значит удалять их нужно самому


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 14:09
Autorization это форма?
Родителей у объектов не видать, значит удалять их нужно самому
Хммм... И как тогда быть ? Ведь я в main объявлял оба объекта. :-\


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 14:12
Autorization это форма?
Родителей у объектов не видать, значит удалять их нужно самому
Хммм... И как тогда быть ? Ведь я в main объявлял оба объекта. :-\
Удалять их в конце работы программы. Если никто другой их не удаляет


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 14:15
Autorization это форма?
Родителей у объектов не видать, значит удалять их нужно самому
Хммм... И как тогда быть ? Ведь я в main объявлял оба объекта. :-\
Удалять их в конце работы. Если никто другой их не удаляет
=))))
Это понятно ))))
Где удалить ?
Объявлял то я в main динамически. Или как - то можно объект удалить из самого себя ? Но ведь тогда указатель созданный в main останется  :-\


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 14:16
Как это где? В конце main, например


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 14:22
Как это где? В конце main, например
Эммм.. Я их создам, а затем тупо сразу удалю ?? Приложение будет работать ?? Или я что-то не понимаю?


Название: Re: Warning при закрытии PG
Отправлено: Bepec от Февраль 27, 2012, 14:25
Эммм.. когда кончается функция Main - у тебя закрывается программа.
Когда ты создаёшь в main класс аля "QMainWindow", то там процесс передаёт управление ему.

Когда QMainWindow закрывается - то опять начинается функция main с момента вызова цикла событий exec().
Вот после него удаляй что хошь ;)


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 14:37
Код:
    return a.exec();
    delete first_connect;
    first_connect = NULL;
Правильно делаю ? Если да, то проблема не устранилась :(


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 14:40
Код:
    return a.exec();
    delete first_connect;
    first_connect = NULL;
Правильно делаю ? Если да, то проблема не устранилась :(

неправильно - return прекращает выполнение функции и все, что за ним, не выполняется


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 14:50
Код:
    return a.exec();
    delete first_connect;
    first_connect = NULL;
Правильно делаю ? Если да, то проблема не устранилась :(

неправильно - return прекращает выполнение функции и все, что за ним, не выполняется
Брррр...
Ваще запутался, в каком именно месте в main мне удалить мои объекты ????


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 14:52
Код:
    return a.exec();
    delete first_connect;
    first_connect = NULL;
Правильно делаю ? Если да, то проблема не устранилась :(

неправильно - return прекращает выполнение функции и все, что за ним, не выполняется
Брррр...
Ваще запутался, в каком именно месте в main мне удалить мои объекты ????

Есть два варианта - быстрый и правильный.

Быстрый:
Код
C++ (Qt)
int res = a.exec();
delete first_connect;
return res;
 

Правильный:
Выучить язык, на котором пишешь


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 15:07
Код:
    return a.exec();
    delete first_connect;
    first_connect = NULL;
Правильно делаю ? Если да, то проблема не устранилась :(

неправильно - return прекращает выполнение функции и все, что за ним, не выполняется
Брррр...
Ваще запутался, в каком именно месте в main мне удалить мои объекты ????

Есть два варианта - быстрый и правильный.

Быстрый:
Код
C++ (Qt)
int res = a.exec();
delete first_connect;
return res;
 

Правильный:
Выучить язык, на котором пишешь

Спс.
Как бы я это и делаю в данный момент )
Просто пост
Цитировать
Эммм.. когда кончается функция Main - у тебя закрывается программа.
Когда ты создаёшь в main класс аля "QMainWindow", то там процесс передаёт управление ему.

Когда QMainWindow закрывается - то опять начинается функция main с момента вызова цикла событий exec().
Вот после него удаляй что хошь
меня и смутил, что имел ввиду автор ?То же самое что и Вы предложили ?
Ммм если не затруднит дайте наводочку на "правильный метод". Всё таки как я понял, быстро не есть хорошо. А хотелось бы чтоб всё идеально работала, да и понять принципы, что к чему.


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 15:15
Автор имеет в виду то же самое. Правильный метод точно такой же, но проистекает из твоих знаний языка)) Выучи C++, чтобы не писать глупости вида
return ...;
delete ...;


Название: Re: Warning при закрытии PG
Отправлено: Bepec от Февраль 27, 2012, 15:21
Согласен, невнятно для новичка объяснил ;)


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Февраль 27, 2012, 15:29
Всем спасибо. Самоучка просто, первый серьёзный проект сам пишу с нуля, надо чтоб всё было учтено. Башка пухнит от потока новой информации, хотя и Qt по сути тот же C++...но не всё так просто.


Название: Re: Warning при закрытии PG
Отправлено: mutineer от Февраль 27, 2012, 15:32
Всем спасибо. Самоучка просто, первый серьёзный проект сам пишу с нуля, надо чтоб всё было учтено. Башка пухнит от потока новой информации, хотя и Qt по сути тот же C++...но не всё так просто.

Qt это расширение плюсов, но ты ведь и плюсов не знаешь, так что все равно с начала все учить:)


Название: Re: Warning при закрытии PG
Отправлено: lit-uriy от Февраль 29, 2012, 16:29
bez_glaz подобное сообщение появляется если у тебя где-нибудь табличная модель связана с БД, а у неё внутри есть запрос (QSqlQuery), в таком случае обычно помогает установка несуществующей таблицы, тогда активного запроса не будет.

П.С.
db.close() часто не спасает от подобного сообщения


Название: Re: Warning при закрытии PG
Отправлено: bez_glaz от Март 01, 2012, 09:29
bez_glaz подобное сообщение появляется если у тебя где-нибудь табличная модель связана с БД, а у неё внутри есть запрос (QSqlQuery), в таком случае обычно помогает установка несуществующей таблицы, тогда активного запроса не будет.

П.С.
db.close() часто не спасает от подобного сообщения
У меня у модели и в них естественно есть запросы SQL. Как понимать "установка несуществующей таблицы".