1. 测试方法
定义一个类Recv,其中包含一个成员变量num和一个成员函数add(),add()实现num的递增。
另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。
单独开一个线程Watcher,每秒计算num变量的增长数值,作为add函数被调用的次数。
class Recv : public QObject {Q_OBJECT
public:unsigned long long num = 0;void add() {num++;}
};class Send : public QObject {Q_OBJECT
public:Send() = default;Send(Recv* r) : r(r) {};void run() {while (true) {emit sig(); // 发送信号,绑定add函数为槽函数//r->add(); // 直接调用}}
signals:void sig();
private:Recv* r;
};class Watcher : public QThread {Q_OBJECT
public:Watcher(Recv* r) : r(r) {}void run() {while (true) {qDebug() << r->num - t; // 计算num的增长t = r->num;QThread::sleep(1);}}
private:Recv* r;unsigned long long t = 0;
};
2. 信号槽调用
int main(int argc, char* argv[])
{QApplication a(argc, argv);Recv r;//Send s(&r);Send s;QObject::connect(&s, &Send::sig, &r, &Recv::add);Watcher* w = new Watcher(&r);w->start();s.run();return a.exec();
}
输出:
每秒调用约 6 × 1 0 7 6\times 10^7 6×107次
3. 直接调用
输出:
每秒调用约 4 × 1 0 9 4\times 10^9 4×109次
4. 结论
信号槽相比函数直接调用慢60倍