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倍