Lagging window/gui when using realtime table view
-
@JKSH said in Lagging window/gui when using realtime table view:
I'm guessing you meant: The program lags when resultAvailable() is emitted (which runs addResult()). In contrast, it doesn't lag if you simply print the Result object's data to the console (using printf() or std::cout or qDebug()) without emitting the signal.
Exactly, sorry for the wrong description.
Quick check: What happens if you don't link your model to the table view (comment out tableView->setModel(...)? Does the UI still lag?
It doesn't lag at all.
That is the entire model code:
#include "resultsmodel.hpp" #include "result.hpp" ResultsModel::ResultsModel(QObject *parent) : QAbstractTableModel(parent) { // ... } int ResultsModel::rowCount(const QModelIndex &) const { return mResults.size(); } int ResultsModel::columnCount(const QModelIndex &) const { return 5; } QVariant ResultsModel::data(const QModelIndex &index, int role) const { if (! index.isValid()) { return QVariant(); } if (index.row() >= mResults.size() || index.row() < 0) { return QVariant(); } auto result = mResults.at(index.row()); if (role == Qt::DisplayRole) { switch (index.column()) { case 0: return result->filename().isEmpty() ? "?" : result->filename(); break; case 1: return result->url(); break; case 2: return result->source(); break; case 3: return result->fileSize().isEmpty() ? "?" : result->fileSize(); break; case 4: return result->isOnline() ? "Yes" : "No"; break; } } return QVariant(); } bool ResultsModel::setData(const QModelIndex &, const QVariant &, int) { return false; } QVariant ResultsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { switch (section) { case 0: return tr("Filename"); break; case 1: return tr("Url"); break; case 2: return tr("Source"); break; case 3: return tr("Size"); break; case 4: return tr("Online"); break; default: return QVariant(); break; } } return QVariant(); } Qt::ItemFlags ResultsModel::flags(const QModelIndex &index) const { if (! index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractTableModel::flags(index); } void ResultsModel::addResult(Result *result) { if (mResults.contains(result)) { return; } auto index = mResults.size(); beginInsertRows(QModelIndex(), index, index); mResults << result; endInsertRows(); } void ResultsModel::reset() { beginResetModel(); qDeleteAll(mResults.begin(), mResults.end()); mResults.clear(); endResetModel(); }@Mr-Gisa said in Lagging window/gui when using realtime table view:
if (mResults.contains(result)) { return; }This is not a good idea...
- why should addResult() called twice with the same pointer? This can only happen due to wrong code on your side
- a linear lookup is maybe fast for < 100 lookups but not for huge data.
-
@JKSH said in Lagging window/gui when using realtime table view:
I'm guessing you meant: The program lags when resultAvailable() is emitted (which runs addResult()). In contrast, it doesn't lag if you simply print the Result object's data to the console (using printf() or std::cout or qDebug()) without emitting the signal.
Exactly, sorry for the wrong description.
Quick check: What happens if you don't link your model to the table view (comment out tableView->setModel(...)? Does the UI still lag?
It doesn't lag at all.
That is the entire model code:
#include "resultsmodel.hpp" #include "result.hpp" ResultsModel::ResultsModel(QObject *parent) : QAbstractTableModel(parent) { // ... } int ResultsModel::rowCount(const QModelIndex &) const { return mResults.size(); } int ResultsModel::columnCount(const QModelIndex &) const { return 5; } QVariant ResultsModel::data(const QModelIndex &index, int role) const { if (! index.isValid()) { return QVariant(); } if (index.row() >= mResults.size() || index.row() < 0) { return QVariant(); } auto result = mResults.at(index.row()); if (role == Qt::DisplayRole) { switch (index.column()) { case 0: return result->filename().isEmpty() ? "?" : result->filename(); break; case 1: return result->url(); break; case 2: return result->source(); break; case 3: return result->fileSize().isEmpty() ? "?" : result->fileSize(); break; case 4: return result->isOnline() ? "Yes" : "No"; break; } } return QVariant(); } bool ResultsModel::setData(const QModelIndex &, const QVariant &, int) { return false; } QVariant ResultsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { switch (section) { case 0: return tr("Filename"); break; case 1: return tr("Url"); break; case 2: return tr("Source"); break; case 3: return tr("Size"); break; case 4: return tr("Online"); break; default: return QVariant(); break; } } return QVariant(); } Qt::ItemFlags ResultsModel::flags(const QModelIndex &index) const { if (! index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractTableModel::flags(index); } void ResultsModel::addResult(Result *result) { if (mResults.contains(result)) { return; } auto index = mResults.size(); beginInsertRows(QModelIndex(), index, index); mResults << result; endInsertRows(); } void ResultsModel::reset() { beginResetModel(); qDeleteAll(mResults.begin(), mResults.end()); mResults.clear(); endResetModel(); }@Mr-Gisa said in Lagging window/gui when using realtime table view:
if (! index.isValid()) { return QVariant(); } if (index.row() >= mResults.size() || index.row() < 0) { return QVariant(); } auto result = mResults.at(index.row());And here I would first check for the role, then the bounds and at last for the validity since this is the most expensive operation here.
-
@Christian-Ehrlicher I made the changes you pointed out and it helped a lot, it's still lagging, but way less than it was before. I can feel the gui freezing when trying to move, and as it's a lot of incoming data per second in the model you can really feel the lag in the gui.
I think you know a software called Wireshark, it was made using Qt and their table receives A LOT (way more than mine) of packets information and it doesn't lag at all, but in my application I can feel the lag when I try to move the window around while the results are being displayed in the table. -
Another idea is to collect some results and add them once in a second (or every n seconds) instead every single one.
-
Because now the compiler don't need to generate debug information and compiles your code with optimizations.
-
You think I should leave that way getting results at real time or do the batched thing? What is the best alternative here?
-
5~10 thousands, I can't get to 100~200 cause I have to code the other APIs, but with that it's working normally at this point.
-
Exactly, that is what I'm going to do. Thank you all for your help. If anything happen in the future I'll say it here.
I'm also going to get a copy with a friend of mine of his Intel Parallel Studio 2018 to check a few things in the application, I hope it works with Qt. -
Exactly, that is what I'm going to do. Thank you all for your help. If anything happen in the future I'll say it here.
I'm also going to get a copy with a friend of mine of his Intel Parallel Studio 2018 to check a few things in the application, I hope it works with Qt.@Mr-Gisa said in Lagging window/gui when using realtime table view:
Intel Parallel Studio 2018
Well its a compiler so good chance it can compile Qt.
-
I'm not going to use the compiler, but the Intel® Inspector and Intel® VTune™ Amplifier.
Intel® Inspector: Memory and Thread Debugger
Intel® VTune™ Amplifier: Performance Profiler -
Yes, but you can also specify the source code and it will show you the places that it has leaks and is slow, stuff like that.