From ed238440a46609c38c30fab8cf6219b8c52cce62 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 24 Mar 2016 21:19:43 -0400 Subject: [PATCH] Stability improvements --- canframemodel.cpp | 36 +++++++++++++++++++++++++----------- canframemodel.h | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index dc0216d..fe54877 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -6,7 +6,11 @@ int CANFrameModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); - if (filteredFrames.data()) return filteredFrames.count(); + if (filteredFrames.data()) + { + int rows = filteredFrames.count(); + return rows; + } //just in case somehow data is invalid which I have seen before. //But, this should not happen so issue a debugging message too @@ -16,7 +20,9 @@ int CANFrameModel::rowCount(const QModelIndex &parent) const int CANFrameModel::totalFrameCount() { - return frames.count(); + int count; + count = frames.count(); + return count; } int CANFrameModel::columnCount(const QModelIndex &index) const @@ -28,8 +34,8 @@ int CANFrameModel::columnCount(const QModelIndex &index) const CANFrameModel::CANFrameModel(QObject *parent) : QAbstractTableModel(parent) { - frames.reserve(10000000); //yes, I'm preallocating 10 million entries in this list. I don't think anyone will exceed this. - filteredFrames.reserve(10000000); + frames.reserve(50000000); //yes, preallocating a huge number of frames. + filteredFrames.reserve(50000000); //the goal is to prevent a reallocation from ever happening dbcHandler = NULL; interpretFrames = false; overwriteDups = false; @@ -80,6 +86,7 @@ void CANFrameModel::setInterpetMode(bool mode) void CANFrameModel::normalizeTiming() { + mutex.lock(); if (frames.count() == 0) return; timeOffset = frames[0].timestamp; for (int i = 0; i < frames.count(); i++) @@ -92,11 +99,14 @@ void CANFrameModel::normalizeTiming() filteredFrames[i].timestamp -= timeOffset; } this->endResetModel(); + mutex.unlock(); } void CANFrameModel::setOverwriteMode(bool mode) { + beginResetModel(); overwriteDups = mode; + endResetModel(); } void CANFrameModel::setFilterState(int ID, bool state) @@ -125,6 +135,7 @@ void CANFrameModel::recalcOverwrite() int lastUnique = 0; bool found; + mutex.lock(); beginResetModel(); for (int i = 1; i < frames.count(); i++) { @@ -148,6 +159,7 @@ void CANFrameModel::recalcOverwrite() while (frames.count() > lastUnique) frames.removeLast(); filteredFrames.clear(); + filteredFrames.reserve(50000000); for (int i = 0; i < frames.count(); i++) { @@ -158,6 +170,7 @@ void CANFrameModel::recalcOverwrite() } endResetModel(); + mutex.unlock(); } QVariant CANFrameModel::data(const QModelIndex &index, int role) const @@ -332,11 +345,9 @@ void CANFrameModel::addFrame(const CANFrame &frame, bool autoRefresh = false) } void CANFrameModel::sendRefresh() -{ - mutex.lock(); +{ qDebug() << "Sending mass refresh"; - QVector tempContainer; - beginResetModel(); + QVector tempContainer; int count = frames.count(); for (int i = 0; i < count; i++) { @@ -345,8 +356,11 @@ void CANFrameModel::sendRefresh() tempContainer.append(frames[i]); } } + mutex.lock(); + beginResetModel(); filteredFrames.clear(); filteredFrames.append(tempContainer); + filteredFrames.reserve(50000000); lastUpdateNumFrames = filteredFrames.count(); endResetModel(); mutex.unlock(); @@ -381,14 +395,12 @@ void CANFrameModel::sendBulkRefresh(int num) if (!overwriteDups) { - mutex.lock(); - if (num > filteredFrames.count()) num = filteredFrames.count(); + //if (num > filteredFrames.count()) num = filteredFrames.count(); //qDebug() << "From " << (filteredFrames.count() - num) << " to " << (filteredFrames.count() - 1); //beginInsertRows(QModelIndex(), filteredFrames.count() - num, filteredFrames.count() - 1); //endInsertRows(); beginResetModel(); endResetModel(); - mutex.unlock(); } else { @@ -404,6 +416,8 @@ void CANFrameModel::clearFrames() frames.clear(); filteredFrames.clear(); filters.clear(); + frames.reserve(50000000); + filteredFrames.reserve(50000000); this->endResetModel(); lastUpdateNumFrames = 0; mutex.unlock(); diff --git a/canframemodel.h b/canframemodel.h index 764c073..7e93007 100644 --- a/canframemodel.h +++ b/canframemodel.h @@ -21,7 +21,7 @@ public: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; int columnCount(const QModelIndex &) const; - int totalFrameCount(); + int totalFrameCount(); void addFrame(const CANFrame &, bool); void sendRefresh();