Qt中的中信号槽与异步调用
来源:互联网 发布:淘宝卖家微淘入口 编辑:程序博客网 时间:2024/05/02 00:48
Qt中使用信号-槽机制处理跨对象之间的调用,该机制的好处有:
1. 使得调用关系的绑定和解除十分灵活,不必修改类成员函数代码
2. 在不暴露更多全局变量的情况下实现跨命名空间调用
3. 可以多个信号对应多个槽,也可以信号之间绑定,对应于GUI中的逻辑很方便
4. 利用Qt::QueuedConnection可以实现异步调用
一般使用
connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::AutoConnection)
第四个参数一般省略
以下详细谈谈第4点:
对于一个多线程GUI程序来说,经常遇到的需求是后台有比较复杂的IO、网络、数据处理逻辑,响应的业务逻辑有多个状态,并常伴有延时。这种情况下用多线程处理比用定时器方便。而一旦使用多线程,就涉及到与GUI主线程的同步问题。
从开发者的角度,希望使用的是“线程透明”的交互机制,即直接跨线程修改GUI控件属性;GUI中用户的输入事件传递到数据处理线程中,并在适当时被响应和处理。
我们希望图形库提供以上封装好的方法,不需要开发者手动处理互斥锁、消息队列等。
Qt做到了。
在Qt中使用
connect(obj1, SIGNAL(TestSignal()), obj2, SLOT(TestSlot()), Qt::QueuedConnection);
跨越对象异步调用信号-槽。注意在obj2中必须调用消息循环
void processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)
这是因为,Qt异步信号槽机制内部基于Event,必须由QObject内置的事件响应函数处理到来的事件,并实际执行槽函数。
Qt中的主要使用以下函数发送消息:
//添加消息到队列末尾void postEvent(QObject * receiver, QEvent * event, int priority = Qt::NormalEventPriority)//添加消息到队列开头bool QCoreApplication::sendEvent(QObject * receiver, QEvent * event)
可以用来发送Qt预定义事件,比如模拟鼠标点击。也可以自定义事件,自定义事件对应ID要大于1024。
一般而言,我们自定义事件的目的本质上是为了远程调用,故直接使用异步信号槽机制即可。除非需要对于传递的数据进行复杂的存储管理,此时再考虑继承Event包含对应数据结构。
以下代码表明,不调用消息循环就无法处理异步信号槽
//test.hclass AsynchronizedSlotTest : public QObject{ Q_OBJECTpublic: AsynchronizedSlotTest(); void runTest(); public slots : void TestSlot();signals: void TestSignal();};
//test.cppAsynchronizedSlotTest::AsynchronizedSlotTest() : QObject(){ //connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::AutoConnection); connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::QueuedConnection);}void AsynchronizedSlotTest::runTest(){ emit TestSignal();}int main(){ AsynchronizedSlotTest slotTest; slotTest.runTest(); return 0;}
将第6行改成第5行就可以,因为此时Qt::DirectConnection直接调用不依赖消息循环
- Qt中的中信号槽与异步调用
- Qt中的信号和槽之connect----多线程调用全解析(同步/异步)
- Qt中的信号和槽之connect----多线程调用全解析(同步/异步)
- QT中的信号与槽
- QT中的信号与槽
- 【QT】:QT中信号与槽详解
- 关于qt中的信号与槽机制
- Qt中的信号与槽机制
- QT中的信号-槽函数与多线程
- Qt中的信号与槽机制解析
- Qt多线程中的信号与槽
- Qt 信号-槽的同步与异步处理
- Qt 信号-槽的同步与异步处理
- Qt 信号-槽的同步与异步处理
- Qt 信号-槽connect的同步与异步处理
- 关于QML中调用qt类中的信号,槽,成员函数,属性做记录
- QML中调用qt类中的信号 槽 成员函数和属性
- Qt 信号与信号,信号与槽
- 【C语言】数据类型转换导致读取参数错误
- OpenLayers3加载Geojson文件
- Hibernate-----多条件查询,多对多添加查询案例
- 数据规整化:清理、转换、合并、重塑
- js动态获取页面高度
- Qt中的中信号槽与异步调用
- Python 通过Jpype调用Java类
- ReactNative图片
- 第12周课后实践(1)
- 关于FM1208之类的CPU卡的总结说明
- 新眼保操
- Linux下安装配置FastDFS
- 学习MyBatis过程中的记录之实体类与表的对应关系
- Codeforces Round #353 (Div. 2) E. Trains and Statistic