Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QMessageBox ошибка сегментации


Автор: KrupaKarlo 16.12.2008, 12:50
Данный класс использован в старой проге и все нормально работает - в новой версии в openDlg  на MessageBox- ах вываливается по ошибке сегментации. Вызовы класса  в программе остались неизменны. Все что связано с работой этого класса не затрагивалось при модификации программы.

gdb говорит что вылет идет в функции QApplication::internalNotify()

не могу разобраться помогите плз

хидер

--------------------------------------------------------------------------------------------------------------------------------
Код


#include <qvariant.h>
#include <qobjectlist.h> 
#include <qdialog.h>
#include <qapplication.h>

#include <sevqt/local.h>
#include "setreglamentdlg.h"

class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
class QSpacerItem;

class QProcess;

class QExecControlUVM : public QDialog
{
        Q_OBJECT

    public:
        QExecControlUVM ( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
        ~QExecControlUVM();
        // Функция открытия диалога
        void openDlg ( int num, QString code );
        // 1-я перегруженная функция открытия диалога
        void openDlg ( QSetReglamentDlg *s, int num, QString code, int com_num );

    protected:
        QProcess* proc;        // Объект для работы с консольной командой
        int number;        // Номер ШФШВ, в который выдается команда
        QString command_code;    // Код выдаваемой команды
        QLocal loc;        // Объект для работы с русским языком
        QSetReglamentDlg *regl;    // Указатель на класс установки/отмены режима РР
        int command_number;    // Номер команды в цепочке
        int flag;        // Флаг открытия окна
        // 1 - открыто из окна управления УВМ
        // 2 - открыто из установки режима РР
        
    protected slots:
        // Слот обработки события завершения консольной команды
        void slotProcessExited();
        void closeEvent ( QCloseEvent *e );
};



Добавлено @ 12:53
цпп-ник

-------------------------------------------------------

Код


#include "execcontroluvm.h"

#include <qvariant.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qprocess.h>
#include <qmessagebox.h>
#include <iostream.h>

#include "setreglamentdlg.h"

QExecControlUVM::QExecControlUVM( QWidget* parent, const char* name, bool modal, WFlags fl )
    : QDialog( parent, name, modal, fl )
{
    if ( !name )
    setName( "QExecControlUVM" );
    
    //create all components and init they zero-order properties
    resize( QSize( 600, 195 ).expandedTo(minimumSizeHint()) );
    clearWState( WState_Polished );

    // Создаем объект для работы с консольной командой
    proc = new QProcess( this );
    
    // Подключаем слоты
    // Слот обработки завершения выполнения консольной команды
    connect( proc, SIGNAL( processExited() ), this, SLOT( slotProcessExited() ) );

}

/*
 *  Destroys the object and frees any allocated resources
 */
QExecControlUVM::~QExecControlUVM()
{
    // no need to delete child widgets, Qt does it all for us
}

/************************************************************************
*                                    *
*    Функция открытия диалога                        *
*    Передаваемые параметры:                        *
*    int num      - номер ШФШВ, в который выдается команда        *
*    QString code - код выдаваемой команды                *
*                                    *
*    Возвращаемые параметры:                        *
*    нет                                *
*                                    *
*************************************************************************/
void QExecControlUVM::openDlg( int num, QString code )
{
    number = num;        // Получаем номер ШФШВ
    command_code = code;    // Получаем код команды

    
    flag = 1;
        
     switch( number )
     {
    case 1:
        if( strstr( command_code, "e" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
------------------------------------ВЫЛЕТАЕТ НА ЭТОМ МЕССЕДЖЕ И ВСЕХ ПОСЛЕДУЮЩИХ--------------------------------
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
                loc.local( "Невозможно запустить команду\n" 
                     "удаленного запуска NTP сервера для УВМ!" ), "OK" );
            cout << "невозможно запустить команду NTP сервера для УВМ" << endl;
            close();
        }
        }

        if( strstr( command_code, "d" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленной остановки NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }    
        
        if( strstr( command_code, "r" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного перезапуска УВМ!" ), "OK" );
            close();
        }
        }    

        if( strstr( command_code, "s" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного выключения УВМ!" ), "OK" );
            close();
        }
        }    

        if( strstr( command_code, "t" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду удаленной\n" 
                     "установки времени и датыдля УВМ!" ), "OK" );
            close();
        }
        }    
        if( strstr( command_code, "1H" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду удаленного\n" 
                     "запуска формирования сигнала с частотой 1Гц для УВМ!" ), "OK" );
            close();
        }
        }         
        break;
        
    case 2:
        if( strstr( command_code, "e" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного запуска NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }    

        if( strstr( command_code, "d" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленной остановки NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }    
            
        if( strstr( command_code, "r" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного перезапуска УВМ!" ), "OK" );
            close();
        }
        }    

        if( strstr( command_code, "s" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного выключения УВМ!" ), "OK" );
            close();
        }
        }    

        if( strstr( command_code, "t" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду удаленной\n" 
                     "установки времени и датыдля УВМ!" ), "OK" );
            close();
        }
        }    
        if( strstr( command_code, "1H" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду удаленного\n" 
                     "запуска формирования сигнала с частотой 1Гц для УВМ!" ), "OK" );
            close();
        }
        }
        break;
    }
}

/************************************************************************
*                                    *
*    1-я перегруженная функция открытия диалога                *
*    Передаваемые параметры:                        *
*    int num      - номер ШФШВ, в который выдается команда        *
*    QString code - код выдаваемой команды                *
*                                    *
*    Возвращаемые параметры:                        *
*    нет                                *
*                                    *
*************************************************************************/
void QExecControlUVM::openDlg( QSetReglamentDlg *s, int num, QString code, int com_num )
{
    regl = s;        // Получаем указатель на класс установки/отмены режима РР
    number = num;            // Получаем номер ШФШВ
    command_code = code;        // Получаем код команды
    command_number = com_num;    // Получаем номер команды в цепочке
    
    flag = 2;

    switch( number )
    {
    case 1:
        if( strstr( command_code, "e" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
------------------------------------ВЫЛЕТАЕТ НА ЭТОМ МЕССЕДЖЕ И ВСЕХ ПОСЛЕДУЮЩИХ--------------------------------
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного запуска NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }

        if( strstr( command_code, "d" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "1" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленной остановки NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }

    case 2:
        if( strstr( command_code, "e" ) != 0 )
        {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленного запуска NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }

        if( strstr( command_code, "d" ) != 0 )
            {
        proc->addArgument( "write_socket" );
        proc->addArgument( "2" );
        proc->addArgument( command_code );
        if( !proc->start() )
        {
            QMessageBox::critical( this, loc.local( "Балтика СЕВ-22" ),
            loc.local( "Невозможно запустить команду\n" 
                     "удаленной остановки NTP сервера для УВМ!" ), "OK" );
            close();
        }
        }
    }
}

/************************************************************************
*                                    *
*    Слот обработки события завершения работы команды            *
*    Передаваемые параметры:                        *
*    нет                                *
*                                    *
*    Возвращаемые параметры:                        *
*    нет                                *
*                                    *
*************************************************************************/
void QExecControlUVM::slotProcessExited()
{
    if( flag == 2 )
     regl->GetRegWork( "r", command_number );

    close();
}

/***************4*********************************************************
*                                    *
*    Слот обработки события закрытия формы                *
*    Передаваемые параметры:                        *
*    нет                                *
*                                    *
*    Возвращаемые параметры:                        *
*    нет                                *
*                                    *
************************************************************************/
void QExecControlUVM::closeEvent( QCloseEvent *e )
{
    e->accept();
}



Автор: ecspertiza 17.12.2008, 17:38
Может это из-за loc.local? пробовал убирать?

Автор: SABROG 17.12.2008, 19:02
Что такое вообще этот loc.local ?

Цитата(ecspertiza @  17.12.2008,  17:38 Найти цитируемый пост)
Один терапевт это 1024 гигапевта и  1048576 мегапевтов


А еще это 1099511627776 килопевтов и всего 1125899906842624 самих певтов.

Автор: KrupaKarlo 18.12.2008, 00:05
точно не в Loc.local дело.  два дня не мог разобраться и вдруг сегодня больше не вываливается по ошибке... фантастика! ничего не понимаю smile 

Автор: SABROG 18.12.2008, 02:04
Цитата(KrupaKarlo @ 18.12.2008,  00:05)
точно не в Loc.local дело.  два дня не мог разобраться и вдруг сегодня больше не вываливается по ошибке... фантастика! ничего не понимаю smile

Магическое покровительство духа программистов снизошло на тебя. Правда обычно их не хватает на долго...

Автор: ecspertiza 18.12.2008, 09:13
Да ещё раз убеждаюсь что главный инструмент программиста это бубен smile 

Автор: KrupaKarlo 18.12.2008, 13:54
просто я когда искал проблему нарыл такой топик
http://forum.codenet.ru/showthread.php?threadid=40097

 там та же проблема была. 
Там вроде как нашли причину, но я не совсем вкурил в чем она заключается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)