关于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;
});
}
总结
- 当信号发送线程和槽函数执行线程都同属于同一个线程时,槽函数执行速度慢于信号间隔,则在槽函数执行期间应该发送的信号实际上是被忽略的,并不会被放入事件队列中
- 当信号与槽函数属于两个线程时,槽函数执行速度慢于信号间隔,则信号会被放入事件队列中,不断的调用槽函数,直到信号用完
- 当信号线程阻塞时,信号也会被阻塞,槽函数也会因为没有信号而不执行