Qt 信号槽
关于Qt 信号槽的笔记
信号槽依赖于Qt自身的循环,每个线程都有自身的一个循环
测试代码如下
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent), ui(new Ui::QtWidgetsApplication1Class())
{ui->setupUi(this);th1 = new QThread;ti1 = new QTimer;th1->moveToThread(th1);//ti1->moveToThread(th1);ti1->setInterval(10);th1->start();//QTimer::singleShot(0, th1, [&]() {ti1->start();//});connect(ti1, &QTimer::timeout, th1, [=]() {QThread::msleep(100);qDebug() << "1111" << QThread::currentThreadId;});QTimer::singleShot(1000, this, [&]() {//qDebug() << "msleep" << QThread::currentThreadId;//QThread::msleep(5000);ti1->stop();qDebug() << "quit" <<QThread::currentThreadId;});}
总结
- 当信号发送线程和槽函数执行线程都同属于同一个线程时,槽函数执行速度慢于信号间隔,则在槽函数执行期间应该发送的信号实际上是被忽略的,并不会被放入事件队列中
- 当信号与槽函数属于两个线程时,槽函数执行速度慢于信号间隔,则信号会被放入事件队列中,不断的调用槽函数,直到信号用完
- 当信号线程阻塞时,信号也会被阻塞,槽函数也会因为没有信号而不执行