Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt4.4] Крашится прога при закрытии дочерних форм, через раз 
V
    Опции темы
GrishinUS
Дата 7.11.2008, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день!

Почти готова моя прога, выполняет все что мне нужно, читает настройки из файла, но периодически вываливается в "программа выполнила недопустимую операцию. Закрыть? Отправить отчет(?)".

Диалоги, при закрытии которых возникает ошибка создаются так :

Код

DoOutImpl OuterForm(&structSettings, &qstrSomewords, &qstrCarID , &qstrTMPKartNum, this);
// exec не делаю, потому что нужно выполнить только код в конструкторе, не показывая диалога
.....
DoInImpl EnterForm(&structSettings, &strTxt1, this );
EnterForm.exec();    


В первом объекте в самом конце конструктора идет запись в БД MS SQL.
Во втором объекте запись в MS SQL происходит по нажатию кнопки.
Я сейчас попробовал закомментировать строки с записью в БД и запустил прогу 10 раз. НЕ вывалилась ни разу.
Значит дело в конструкции, выполняющей запись в БД.
Конструкция следующая :

{
    QString strQuery;
    strQuery = "update......";
    QSqlQuery query(strQuery);
    return query.exec();
}

в первом случае это update, а во втором insert

PS: подозреваю что SQL сервер не успевает вернуть результат
PM MAIL ICQ   Вверх
SABROG
Дата 7.11.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Учись пользоваться дебагерром. Не забудь смотреть в консоль, возможно через qDebug() Qt что-то сообщает. Слишком мало информации. На вид ничего страшного не делается.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
GrishinUS
Дата 7.11.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(SABROG @ 7.11.2008,  09:38)
Учись пользоваться дебагерром. Не забудь смотреть в консоль, возможно через qDebug() Qt что-то сообщает. Слишком мало информации. На вид ничего страшного не делается.

в консоли пусто.
в дебаггере (использую qt creator) -- вроде бы точка срабатывает, но в то же время не становится желтой и не появляются переменные для обзора, см прикрепленное файло

user posted image
PM MAIL ICQ   Вверх
chaos
Дата 7.11.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



GrishinUS, може стоит убрать из конструктора работу с бд в отдельную инициализирующую функцию?
или надо как минимут заключить этот кусок кода в try ... catch
PM WWW   Вверх
GrishinUS
Дата 7.11.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(chaos @ 7.11.2008,  11:51)
GrishinUS, може стоит убрать из конструктора работу с бд в отдельную инициализирующую функцию?
или надо как минимут заключить этот кусок кода в try ... catch

Это можно убрать, во втором случае у меня так и сделано -- работа с БД по событию.
Все равно крашится.
==> сейчас это непринципиальный вопрос где работать с БД : в конструкторе или в отдельном методе.
PM MAIL ICQ   Вверх
chaos
Дата 7.11.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



GrishinUS, далее засунь код в блок try catch и проверяй еще раз
PM WWW   Вверх
GrishinUS
Дата 7.11.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(chaos @ 7.11.2008,  12:46)
GrishinUS, далее засунь код в блок try catch и проверяй еще раз

Засунул. И что там ловить?
PM MAIL ICQ   Вверх
chaos
Дата 7.11.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(GrishinUS @ 7.11.2008,  11:17)
Цитата(chaos @ 7.11.2008,  12:46)
GrishinUS, далее засунь код в блок try catch и проверяй еще раз

Засунул. И что там ловить?

для начала лови ... просто ради проверки - упадет не упадет. а дальше будешь думать.
PM WWW   Вверх
SABROG
Дата 7.11.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Может быть где-то здесь кроется проблема ?

Цитата

QString QObject::trUtf8 ( const char * sourceText, const char * comment = 0, int n = -1 )   [static]
Returns a translated version of sourceText, or QString::fromUtf8(sourceText) if there is no appropriate version. It is otherwise identical to tr(sourceText, comment, n).
Warning: This method is reentrant only if all translators are installed before calling this method. Installing or removing translators while performing translations is not supported. Doing so will probably result in crashes or other undesirable behavior.



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
GrishinUS
Дата 10.11.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



trUtf8 убрал, крашится все равно :(
PM MAIL ICQ   Вверх
mes
Дата 10.11.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 7
Всего: 250



Цитата(GrishinUS @  7.11.2008,  08:19 Найти цитируемый пост)
Диалоги, при закрытии которых возникает ошибка создаются так :

ошибка при закрытии, а даете нам код создания.  smile 

Цитата(GrishinUS @  10.11.2008,  14:43 Найти цитируемый пост)
крашится все равно :( 

Приведите код ваших диалогов.

Это сообщение отредактировал(а) mes - 10.11.2008, 23:51


--------------------
PM MAIL WWW   Вверх
GrishinUS
Дата 11.11.2008, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код с INSERT :

Код

int DoInImpl::WriteIntoInOut(const QModelIndex& qIndex)
{
    int row = qIndex.row();    
    int i = 1;    
    
    QString qstrModel;
    QString qstrGosnomer;
    QString qstrVladelec;
    QString qstrVin;
    QString qstrID;

    QString str;
    
    QModelIndex index = model->index(row, 0, QModelIndex());
    while (index.isValid())
        {
        QVariant value = model->data(index);
        if(i == 5)
         qstrID = value.toString();
        str = str +" " + value.toString();
        index = model->index(row, i++, QModelIndex());
        }
    /*txt12->setText(str);
    qDebug() << qstrModel << ":" << qstrGosnomer << ":" << qstrVladelec << ":" << qstrVin << ":" << qstrID;*/    
    
    // делаем запись РІ InOut
    QSqlDatabase dbInOut2 = QSqlDatabase::addDatabase("QODBC");

    QString qstrConnectionString = "Driver={SQL Native Client};Server=";
    qstrConnectionString.append(structSettings.InOutServ);
    qstrConnectionString.append(";Database=");
    qstrConnectionString.append(structSettings.InOutDataBase);
    qstrConnectionString.append(";Uid=");
    qstrConnectionString.append(structSettings.InOutDataBaseUser);
    qstrConnectionString.append(";Pwd=");
    qstrConnectionString.append(structSettings.InOutDataBasePassword);

    dbInOut2.setDatabaseName(qstrConnectionString);
    
    bool connected = dbInOut2.open();
    if (!connected) 
        {
         QMessageBox msgBox;

                msgBox.setText("database : InOut");
                msgBox.setIcon(QMessageBox::Critical);
                msgBox.setDefaultButton(QMessageBox::Save);
                msgBox.setInformativeText(dbInOut2.lastError().text());
                msgBox.setStandardButtons(QMessageBox::Ok);
                msgBox.setDefaultButton(QMessageBox::Ok);
                msgBox.exec();

                return 10;
        }

    QSqlQuery query;
    QString strQuery;
    strQuery = "INSERT "
    "INTO InOut "
    "    (KartaNum "
    "    , DateIn "
    "    , PostIn "    
    "    , CarID) "
    "VALUES ( ";
    strQuery.append("'");
    strQuery.append(txt1);
    strQuery.append("'");
    strQuery.append(
    "    , GETDATE() "
    "    , 1 "
    "    , '" + qstrID + "')");    

    query.exec(strQuery);

    close();

    return 0;
}


Код с UPDATE:

Код

int DoOutImpl::DoOut()
{
    QSqlDatabase dbInOut2 = QSqlDatabase::addDatabase("QODBC");

    QString qstrConnectionString = "Driver={SQL Native Client};Server=";
    qstrConnectionString.append(structSettings.InOutServ);
    qstrConnectionString.append(";Database=");
    qstrConnectionString.append(structSettings.InOutDataBase);
    qstrConnectionString.append(";Uid=");
    qstrConnectionString.append(structSettings.InOutDataBaseUser);
    qstrConnectionString.append(";Pwd=");
    qstrConnectionString.append(structSettings.InOutDataBasePassword);

    dbInOut2.setDatabaseName(qstrConnectionString);

    bool connected = dbInOut2.open();
    if (!connected)
        {
                QMessageBox msgBox;

                msgBox.setText("database : InOut");
                msgBox.setIcon(QMessageBox::Critical);
                msgBox.setDefaultButton(QMessageBox::Save);
                msgBox.setInformativeText(dbInOut2.lastError().text());
                msgBox.setStandardButtons(QMessageBox::Ok);
                msgBox.setDefaultButton(QMessageBox::Ok);
                msgBox.exec();

                return 10;
        }

    //QSqlQuery query;
    QString strQuery;
    strQuery = "update "
    "   InOut "
    "set "
    "   DateOut = GetDate() "
    "   , PostOut = ";
    strQuery.append(structSettings.Post);
    strQuery.append(" where "
    "   CarID = '");
    strQuery.append(*qstrCarID);
    strQuery.append("'");
    strQuery.append(" and "
    " KartaNum = ");
    strQuery.append(*qstrKartNum);
    try
    {
        QSqlQuery query(strQuery);
    }
    catch( char *str )
    {
        qDebug() << "Caught some other exception: " << str << "\n";
    }

    qDebug() << "sql sehr gut ==> " << strQuery;

    return 0;
}

PM MAIL ICQ   Вверх
mes
Дата 11.11.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 7
Всего: 250



Цитата(GrishinUS @  11.11.2008,  07:55 Найти цитируемый пост)
Код с INSERT :

Я чего то не пойму.. У Вас когда прога крашится ? при выполнении этих функций или при закрытии диалога?
Я как понял при закрытии, но где ж тогда описания класса, конструкторов и деструктора?



--------------------
PM MAIL WWW   Вверх
SABROG
Дата 11.11.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



А я вообще ничего не понимаю. В этих функциях каждый раз создается новое соединение с базой, прежде чем выполнить запрос  smile 


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
GrishinUS
Дата 11.11.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(SABROG @ 11.11.2008,  13:06)
А я вообще ничего не понимаю. В этих функциях каждый раз создается новое соединение с базой, прежде чем выполнить запрос  smile

Не обращайте внимания. Прога работает с тремя БД, к какой именно БД коннектиться зависит от условий. Я делаю допущение, что на момент выполнения запроса имеется коннект к другой базе.

Конструкторы, как просил mes. Первый :

Код

DoInImpl::DoInImpl(iniSettings *structFormalSettings, QString *formalTxt1, QWidget * parent, Qt::WFlags f) : QDialog(parent, f)
{
    setupUi(this);
        this->txt1 = formalTxt1;
        this->structSettings = *structFormalSettings;
        connect(txt12, SIGNAL(returnPressed()), this, SLOT(RarusRequest()));
        connect(pushButton, SIGNAL(clicked()), this, SLOT(RarusRequest()));

    connect(tableView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(WriteIntoInOut(const QModelIndex&)));
}


Второй :

Код

DoOutImpl::DoOutImpl(iniSettings *structFormalSettings, QString *qstrFormalSomewords, QString *qstrFormalCarID, QString *qstrFormalKartNum, QWidget * parent, Qt::WFlags f)
    : QDialog(parent, f)
{
        setupUi(this);
        this->qstrCarID = qstrFormalCarID;
        this->qstrKartNum = qstrFormalKartNum;
        this->qstrSomewords = qstrFormalSomewords;
        this->structSettings = *structFormalSettings;

        connect(btnOK, SIGNAL(clicked()), this, SLOT(DoOut()));

        this->boolCanDoOut = true;
        ConnectToRarusDB();


        if(     CheckNewAndTunning1() == 20 ||
                CheckNewAndTunning2() == 20 ||
                CheckNewAndTunning3() == 20 ||
                CheckNewAndTunning4() == 20 ||
                CheckNewAndTunning5() == 20)
    {
            this->boolCanDoOut = false;
        }
        if(boolCanDoOut)
        {
         DoOut();
        }

}


Деструкторов нет.

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

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

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


 




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


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

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