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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получен сигнал... Приложение остановлено...  (Прочитано 8186 раз)
TheBlade
Гость
« : Февраль 27, 2010, 01:27 »

Доброго времени суток. У меня такая проблемма, может кто-то сталкивался.
Считываю из файла в QList где-то ~12000 ~240000 структур весом по 60 байтов.
На считывание файла стоит прогресс бар, по которому видно сколько примерно считалось структур.
Запускаю дебаггер, брейкпоинты стоят после того как файлы считались.
При этом с завидной переодичностью (т.е. почти всегда) Дебаггер выдает:

Получен сигнал
Приложение остановлено так как оно получило сигнал от операционной системы.
Сигнал: SIGSEGV
Назначение: Segmentation fault

После этого, продолжать нельзя...

Примечательно то, что сообщение может быть получено в начале, середине, конце считывания, или не выскачить вовсе (тогда можно спокойно работать)

Версия кератора и qt от 2009.05
В ранних версиях такого не было.

З.Ы. Дебагер останавливается на функции:
template <typename T>
Q_INLINE_TEMPLATE void QList<T>::node_construct(Node *n, const T &t)
{
    if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) n->v = new T(t);
    else if (QTypeInfo<T>::isComplex) new (n) T(t);
    else *reinterpret_cast<T*>(n) = t;
}

Помогите разобраться. Буду очень признателен за любую помощь.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Февраль 27, 2010, 03:56 »

Покажи код или выложи минимальный пример который воспроизводит сегфолт
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
b-s-a
Гость
« Ответ #2 : Февраль 28, 2010, 23:48 »

TheBlade, если у тебя Линукс, то запусти свою прогу под valgrind (только количество файлов уменьши раз в 100) под проверкой memcheck. Он тебе покажет ошибки твоей программы. Возможно, ты найдешь причину в своей программе.
Записан
TheBlade
Гость
« Ответ #3 : Март 01, 2010, 15:37 »

Нет, у меня виндовс.
Записан
NicK
Гость
« Ответ #4 : Март 02, 2010, 11:04 »

Если считывание происходит в основном потоке и нтерфейс "замерзает", это может заставить винду думать что программа висит, вот она и посылает соотвествующий сигнал, чтоб убить подвисшее приложение.

если я прав, то ка вариант, используйте потоки, ну или, хотя бы, processEvents() вставляйте.
« Последнее редактирование: Март 02, 2010, 11:07 от NicK » Записан
TheBlade
Гость
« Ответ #5 : Март 03, 2010, 00:20 »

Считывание происходит в другом потоке.
Что такое ProcessEvents()?
Записан
TheBlade
Гость
« Ответ #6 : Март 03, 2010, 00:27 »

Вот, урезал код, как мог, сообщение выдает...
mainwindow.h
Код:
namespace Ui
{
    class MainWindow;
}
//#pragma pack (push,1)
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void openInputFile();

private:
    Ui::MainWindow *ui;
    MathThread mathThread;
    QProgressBar *prBar;
    QList<SEND> list;
};
mainwindow.cpp
Код:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    prBar = new QProgressBar();

    connect(ui->actionOpen,SIGNAL(triggered()),this,SLOT(openInputFile()));

    connect(&mathThread,SIGNAL(startProcess()),prBar,SLOT(show()));
    connect(&mathThread,SIGNAL(maximum(int)),prBar,SLOT(setMaximum(int)));
    connect(&mathThread,SIGNAL(increase(int)),prBar,SLOT(setValue(int)));
    connect(&mathThread,SIGNAL(finishProcess()),prBar,SLOT(hide()));
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openInputFile()
{
    mathThread.setReadSourceFileMode();
    mathThread.setFileName(QFileDialog::getOpenFileName(this,"OpenFile Dialog",0,"*.mki"));
    prBar->move(pos().x()+(width() - prBar->width())/2,pos().y()+(height() - prBar->height())/2);
    mathThread.start();
}

maththread.h
Код:
class MathThread : public QThread
{
    Q_OBJECT

public:
    MathThread();
    void setReadSourceFileMode();//Установить режим чтения исходного файла
    void setMathListMode();    //Установить режим работы со структурой Data результаты заносятся в list
    void setWriteWorkFileMode(); //Установить режим записи в файл узлов list
    void setFileName(QString str); //Установить имя входного/выходного файла
    QList<SEND> *getWorkList();        //Передать *list в место вызова
    QList<SEND> *getSourceList();        //Передать *list в место вызова
    QList<Rez_29_A> *getList_29();        //Передать *list в место вызова
    QString& getSourceFileName();
    QList<QPoint> arrayOfModa;
    friend int SendData(int Regim);
    friend int ReadData(FILE *ReadFil);
    bool atOnce;

signals:
    void error(QString);       //Сигналы ошибок
    void message(QString);
    void maximum(int);
    void increase(int);
    void startProcess();
    void finishProcess();
    void finishMath();

protected:
    void run();                //Главная функция потока

private:
    QList<SEND> *workList,*sourceList;
    QList<Rez_29_A> *list_29;
    QFile file;
    QString fileName;
    enum Mode {ReadSourceFile,MathList,WriteWorkFile} mode;
};

maththread.cpp
Код:
MathThread::MathThread()
{
    sourceList = new QList<SEND>;
    list_29 = new QList<Rez_29_A>;
}
void MathThread::run()
{
    switch(mode)
    {
        case ReadSourceFile:
            emit startProcess();
            file.setFileName(fileName);
            if (!file.open(QIODevice::ReadOnly))
            {
                emit error(tr("Cannot read file %1:\n%2.")
                            .arg(file.fileName())
                            .arg(file.errorString()));
            }
            else
            {
                sourceList->clear();
                QByteArray CMD = file.peek(2);
                if(CMD.toInt() != 8)
                {
                    emit maximum(file.size()/sizeof(Rez_10_A2));
                    while(!file.atEnd())
                    {
                        sourceList->append(*(SEND *) file.read(sizeof(Rez_10_A2)).data());
                        if(sourceList->count()%1000 == 0)
                            emit increase(sourceList->count());
                    }
                    file.close();
                    emit message(QString("sourceList has %1 elements").arg(QString::number(sourceList->count())));

                    list_29->clear();
                    QString str = fileName;
                    str.chop(4);
                    str += "_29.mki";
                    file.setFileName(str);
                    if (!file.open(QIODevice::ReadOnly))
                    {
                        emit error(tr("Cannot read file %1:\n%2.")
                                    .arg(file.fileName())
                                    .arg(file.errorString()));
                    }
                    else
                    {
                        emit maximum(file.size()/sizeof(Rez_29_A));
                        while (!file.atEnd())
                        {
                            list_29->append(*(Rez_29_A *) file.read(sizeof(Rez_29_A)).data());
                            if (list_29->count()%1000 == 0)
                                emit increase(list_29->count());
                        }
                        emit message(QString("list of termo has %1 elements from %2").arg(QString::number(list_29->count()),str));
                    }
                }
                else
                {
                    emit maximum(file.size()/sizeof(Rez_8_A2));
                    while (!file.atEnd())
                    {
                        workList->append(*(SEND *) file.read(sizeof(Rez_8_A2)).data());
                        if(workList->count()%1000 == 0)
                            emit increase(workList->count());
                    }
                    emit error("File of 8 regim was reading");
                    emit finishMath();
                }
                file.close();
                //emit message(QString("We get %1 bad massages").arg(QString::number(badData)));
            }

            emit finishProcess();
        break;
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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