Название: Получен сигнал... Приложение остановлено...
Отправлено: 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; }
Помогите разобраться. Буду очень признателен за любую помощь.
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: pastor от Февраль 27, 2010, 03:56
Покажи код или выложи минимальный пример который воспроизводит сегфолт
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: b-s-a от Февраль 28, 2010, 23:48
TheBlade, если у тебя Линукс, то запусти свою прогу под valgrind (только количество файлов уменьши раз в 100) под проверкой memcheck. Он тебе покажет ошибки твоей программы. Возможно, ты найдешь причину в своей программе.
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: TheBlade от Март 01, 2010, 15:37
Нет, у меня виндовс.
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: NicK от Март 02, 2010, 11:04
Если считывание происходит в основном потоке и нтерфейс "замерзает", это может заставить винду думать что программа висит, вот она и посылает соотвествующий сигнал, чтоб убить подвисшее приложение.
если я прав, то ка вариант, используйте потоки, ну или, хотя бы, processEvents() вставляйте.
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: TheBlade от Март 03, 2010, 00:20
Считывание происходит в другом потоке. Что такое ProcessEvents()?
Название: Re: Получен сигнал... Приложение остановлено...
Отправлено: TheBlade от Март 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; } }
|