槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
connect(this, &Widget::startThread, myT, &MyThread::myTimeout,Qt::BlockingQueuedConnection)
登录后复制
这个也是可以的,但是当我们子线程,处理所需时间很长时,
主线程会出现明显的卡顿,效果不太好。
方法二:
使用bool QObject::blockSignals(bool block)函数屏蔽信号发送,当槽函数处理完后,再开启。
子线程下的改动:
void MyThread::myTimeout()
{
qDebug() <<"test"
QThread::sleep(2)
emit recover()
}
登录后复制
主线程下的改动:
void Widget::on_recover()
{
ui->buttonStart->blockSignals(false)
}
void Widget::on_buttonStart_clicked()
{
emit startThread()
ui->buttonStart->blockSignals(true)
}
登录后复制
增加信号连接函数:
connect(this, &Widget::startThread, myT, &MyThread::myTimeout)
connect(myT, &MyThread::recover, this, &Widget::on_recover)
登录后复制
通过增加对信号发送的限制,这样的话可以实现,只有在槽函数处理完成后,才会开始发送信号。
但是用这个函数有一个问题就是,这个对象的所有信号,在屏蔽的期间都不会发送了,也需要等槽函数处理完之后才能发送信号,实验代码如下。
void Widget::on_buttonStart_clicked()
{
emit startThread()
ui->buttonStart->blockSignals(true)
}
void Widget::on_buttonStart_pressed()
{
qDebug() <<"信号能正常触发"
}
登录后复制
所以如果说两个对象之间只是一对一的信号连接的话,可以使用blockSignals函数
1、屏蔽信号的方式还可以用:
void MyThread::myTimeout()
{
QObject::sender()->blockSignals(true)
QThread::sleep(2)
QObject::sender()->blockSignals(false)
}
登录后复制
这样的话就可以直接在槽函数里,实现将发送信号的对象屏蔽和恢复。
1:socket句柄就是一个整型,是映射到系统句柄队列里面(你可以认为这个值是一个key,一个key对应一个系统的具体socket结构体),指针是无意义的,比方你创建了一个socket句柄值是10,你直接使用10在任何线程都是调用这个socket,这个映射过程是socket相关api内部完成的,是全局的。2:多个线程共用一个socket分别处理收发是可以的,很多这样的例子,一些网络IO模型就是一个部分线程负责收数据包,部分线程负责发响应包,但不要多个线程共用一个socket来收,这样会导致问题。
3:你要多线程共享socket句柄,直接传值就行了,不要传引用和指针,不过注意socket关闭的同步处理。最好用一个对象来统一处理每个socket的打开和关闭,读取和发送。所有线程拿着这个对象来操作socket,这样socket的有效性判断都在对象里面处理。不然一个线程关闭了socket,子线程不知道继续拿着这个句柄号在操作就会出问题。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)