qt怎么控制发包速率

qt怎么控制发包速率,第1张

方法一:使用connect的第五个参数,设置为Qt::BlockingQueuedConnection

函数的调用时机与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,子线程不知道继续拿着这个句柄号在操作就会出问题。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/390644.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存