Производительность снижается из-за использования QThread и нескольких соединений сигналов и слотов - PullRequest
1 голос
/ 20 февраля 2020

У меня проблемы с попыткой выяснить, откуда происходит снижение производительности в моих кодах. Моя программа довольно большая, поэтому я приведу несколько простых примеров. Скажем, у меня есть класс 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 () должны выполняться в другом потоке.

Любые идеи будут оценены!

...