У меня проблемы с попыткой выяснить, откуда происходит снижение производительности в моих кодах. Моя программа довольно большая, поэтому я приведу несколько простых примеров. Скажем, у меня есть класс MainUI, подкласс из QMainWindow, который имеет два объекта-члена, рабочий (подкласс из QThread) и DisplayPanel (подкласс из QGLWidget). Затем устанавливается соединение между сигналом от этого объекта Worker (излучаемым из его метода run) и слотом в объекте DisplayPanel. И я вижу снижение производительности в методе запуска, если я увеличиваю количество соединений.
В основном я описываю (очень упрощенно):
class Worker : public QThread {
Q_OBJECT
signals:
void updateDisplay();
protected:
void startWorking() {
// some setup codes
this->start();
}
void run() {
while (1) {
// some processing codes
emit updateDisplay();
}
}
};
class DisplayPanel : public QOpenGLWidget, protected QOpenGLFunctions_5_0_Core {
Q_OBJECT
public slots:
void refresh() {
update();
}
};
class MainUI : public QMainWindow {
Q_OBJECT
public:
explicit MainUI(QWidget *parent = 0) {
// some Ui setup codes
worker = new Worker();
num_panels = 5 // arbitrary number
panels.resize(num_panels);
for (auto p : panels) {
p = new DisplayPanel();
connect(worker, SIGNAL(updateDisplay()), p, SLOT(refresh()));
}
}
void process() {
worker->startWorking();
}
private:
unsigned num_panels;
Worker* worker;
std::vector<DisplayPanel*> panels;
};
Представьте себе MainUI :: process (), вызванный из GUI.
Что меня смущает, так это некоторое заметное снижение производительности в то время как l oop Worker :: run (), если я увеличу MainUI :: num_panels. Насколько я понимаю, увеличенное количество соединений с сигналами и слотами не должно сильно влиять на производительность Worker, потому что запросы в очереди к DisplayPanel :: update () должны выполняться в другом потоке.
Любые идеи будут оценены!