QT 异步函数转为同步函数的方法
来源:互联网 发布:linux head 编辑:程序博客网 时间:2024/03/29 15:42
来源: http://blog.sina.com.cn/s/blog_413978670100m9y3.html
在QT中,一般推荐使用异步函数。除了异步函数的非阻塞特性外,QT的Signal/Slot特性在异步函数中可以得到充分的发挥。因此,在QT中,很多API的设计都是使用非阻塞的异步函数作为API,然后执行结果使用Signal返回。用户执行API后使用slot函数接收反馈结果。
但是在很多场景下,我们的确可能需要同步函数。也就是说函数在返回执行结果之前必须阻塞,调用函数后必须得到相应的执行结果。这时候,对于大量使用signal/slot的QT程序来说,经常需要将一个异步函数转变为同步函数。具体的转换做法如下。
例如一个异步的login函数:
void login(const QString& username, const QString& password);
返回值使用signal通知:
OnLoginStatusChanged();
下面就是这个异步函数的同步版本:
int loginSync(const QString& username, const QString& password)
{
q; QEventLoop
t.setSingleShot(true);
connect(&t, SIGNAL(timeout()), &q, SLOT(quit())); //异步调用超时退出
connect(this, SIGNAL(OnLoginStatusChanged()), &q, SLOT(quit())); //异步调用完成退出
Login(username, password); //调用异步函数
t.start(timeout);
q.exec();
//以下可以根据异步函数的返回结果进行进一步操作并返回函数结果。
}
需要注意的是,EventLoop的ProcessEvent实际上封装的是QAbstractEventDispatcher ::processEvents。
QT帮助文件中有这样的描述:
An event dispatcher receives events from the window system and other sources. It then sends them to the
也就是说,使用QAbstractEvent,或者说使用EventLoop,需要有QCoreApplication或者QApplication的存在。
对于GUI程序,这一点不是问题。问题在于对于很多consoleUI命令行程序,很多时候我们并不创建QCoreApplication或者QApplication对象。这样的场景下Eventloop自然无法正常使用。
因此,如果是在命令行中调用一个用这种方式封装的同步函数,必须有一个QCoreApplicaion或者QApplication对象存在。
- QT 异步函数转为同步函数的方法
- QT 异步函数转为同步函数的方法
- QT 异步函数转为同步函数的方法
- 同步函数与异步函数的讲解
- 同步函数与异步函数
- “同步”函数与“异步”函数
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数 .
- 同步函数与异步函数
- 同步函数与异步函数 .
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数
- 同步函数与异步函数
- StringTokenizer类的详解
- 同步函数与异步函数 .
- shell sort (python implementation)
- 再谈计算机内存访问之1:内存管理概述
- 对应用进行单元测试(junit)
- QT 异步函数转为同步函数的方法
- 笔记本怎么设置WIfi热点
- QThread中的互斥、读写锁、信号量、条件变量
- 我是如何开发一个连锁企业的信息系统的,NO.2
- 工作中遇到的小问题
- 离完美有点远 破解四个大数据神话
- Hadoop分布式集群配置
- 数据仓库开始----范围的确定
- 可重入、异步信号安全和线程安全 .