QT 异步函数转为同步函数的方法

2023-11-13

QT 异步函数转为同步函数的方法

  (2010-11-18 17:29:13)
标签: 

eventloop

 

同步函数

 

异步函数

 

qt

 

it

分类: C和Cpp
在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)
{
    int timeout = 30 * 1000;  //超时时间设置
    QTimer t ;
  QEventLoop q;
  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 
  QCoreApplication  or QApplication  instance for processing and delivery. QAbstractEventDispatcher  provides fine-grained control over event delivery.
也就是说,使用QAbstractEvent,或者说使用EventLoop,需要有QCoreApplication或者QApplication的存在。
对于GUI程序,这一点不是问题。问题在于对于很多consoleUI命令行程序,很多时候我们并不创建QCoreApplication或者QApplication对象。这样的场景下Eventloop自然无法正常使用。
因此,如果是在命令行中调用一个用这种方式封装的同步函数,必须有一个QCoreApplicaion或者QApplication对象存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 异步函数转为同步函数的方法 的相关文章

  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 从窗口内容截取屏幕截图(无边框)

    我正在寻找有关如何使用 C 将表单内容保存在位图中的解决方案 我已经尝试过使用 DrawToBitmap 但它捕获了所有带边框的窗口 这就是这段代码的结果 public static Bitmap TakeDialogScreenshot
  • 简单的文档管理系统和API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value
  • 如何将 Metro 应用部署到桌面?

    我正在尝试将我的 C 应用程序部署到我的 Windows 8 Metro 桌面 我可以在 bin 文件夹中看到部署的文件 但是当我尝试打开它们时 出现以下错误 该应用程序只能在 AppContainer 的上下文中运行 我检查了属性上下文菜

随机推荐

  • LVM精简卷(Thinly-Provisioned Logical Volumes)

    可能LVM大家都比较熟悉 那么精简卷又是干什么的呢 相比于普通LVM有什么优势 又会带来哪些新的问题 带着这些我们来一探究竟 工作原理 在创建Thin 瘦 卷时 预分配一个虚拟的逻辑卷容量大小 而只是在实际写入数据时才分配物理空间给这个卷
  • 开源超级终端工具——WindTerm

    1 下载和安装 我的是win10 其他版本各位自选 Releases kingToolbox WindTerm GitHub 安装的话 相信大家不用我赘述了 初始界面是这样的 2 WindTerm使用 2 1 本地会话 最下面那个框 发送
  • html5 blob video 下载

    最近在看腾讯视频时 想把它下载下来 发现 video src 是 blob 加密的源 不能像以前那样看到一个mp4的 url
  • 【mysql将一个表的数据添加到另一个表中】

    mysql将一个表的数据添加到另一个表中 1 两个表的结构一致 将表B数据添加到A中 INSERT INTO A SELECT FROM B 插入时若存在主键冲突 使用以下sql删掉重复数据 DELETE b FROM A a B b WH
  • 计算机网络——数据链路层

    数据链路层 交换机 switch 的基本原理 theory 与配置 config 交换机 工作在数据链路层 用于组织局域网 常见的品牌有H3C 华为 思科 锐捷 tp link 以太网 Ethernet 即局域网 MAC地址 网卡里会带有的
  • 如果只能选3个伦敦金投资技巧,我会选这3个

    伦敦金投资是很考验投资者技术的一个投资项目 如果说股票投资大部分都看基本面 技术面值作为判断的话 那么伦敦金投资责刚刚相反 他很注重技术面方面的分析 所以 在伦敦金市场中 我们会看到市面上有很多有关于投资方面的教学 不过 在众多教学当中 如
  • 常见特征工程操作

    常见的特征工程包括 异常处理 1 通过箱线图 或 3 Sigma 分析删除异常值 2 BOX COX 转换 处理有偏分布 3 长尾截断 特征归一化 标准化 1 标准化 转换为标准正态分布 2 归一化 抓换到 0 1 区间 3 针对幂律分布
  • 2023年十大最佳自动化测试工具(建议收藏)

    Best Automation Testing Tools for 2023 对更快交付高质量软件 或 快速质量 的需求要求组织以敏捷 持续集成 CI 和DevOps方法论来寻找解决方案 测试自动化是这些方面的重要组成部分 最新的 2018
  • 【满分】【华为OD机试真题2023 JS】相同数字的积木游戏1

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 相同数字的积木游戏1 知识点数组循环map 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小华和小薇一起通过玩积木游戏学习数学 他们有很多积木 每个积木块上都有
  • 查找Chrome浏览器header中的user-Agent两种方法

    user Agent是浏览器搜索信息 可以用它来模拟浏览器进行浏览 从而进行爬取网页信息 爬虫 第一种方法 首先 F12或右键 检查网页元素 之后 NetWork index header user Agent 第二种方法 在浏览器直接搜索
  • 1.软件设计模式概述

    软件设计模式的产生背景 设计模式 这个术语最初并不是出现在软件设计中 而是被用于建筑领域的设计中 1977 年 美国著名建筑大师 加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫 亚历山大 Christopher Alexander 在他
  • css如何实现进度条??

    css 如何实现进度条 在生活中 我们不经意间就会看到很多的 手机app上都会有带进度条 精简的软件会给我们视觉上的享受 那进度条是如何实现的呢 首先 创建一个大小自定义的div模块为外层 其下再创建布局两个div左右布局 在这两个div下
  • 模拟信号和数字信号

    模拟 幅值随时间连续变化 如温度 位移 湿度等等 数字 幅值随时间都离散的信号 离散和连续相对 如下图发生突变就是离散 计算机中是二值逻辑信号 特点 模拟 保密性差 易收干扰 无转换误差 脉冲信号 二值信号就是脉冲信号 如方波pwm trr
  • JAVA 简单的getJSONObject、getJSONArray用法

    msg success code 0 page getJSONObject page totalCount 108 pageSize 10 totalPage 11 currPage 1 list getJSONArray list get
  • ABA问题基础及解决

    一 ABA问题的产生 二 AtomicReference原子引用 三 AtomicStampedReference版本号原子引用 四 ABA问题解决 前面的内容之间的关联 CAS gt Unsafe类 gt CAS思想 gt ABA问题 g
  • debian安装问题:Debootstrap错误无法确定发行版

    安装debian7 7 到了安装基本系统的步骤 系统记载提示标题的那个错误 原因就是找不到U盘的文件 解决方法 在partition完成之后 拔掉U盘 然后再插入 按 Ctrl Alt F2 进入命令模式 用命令 fdisk l 查看U盘的
  • Debian9 arm架构(rk3288)有线网络设置固定IP

    问题 之前在没改动部分硬件前的RK3288板子 设置有线网络eth0固定IP的方法为 在 etc network interfaces文件添加如下内容 auto eth0 iface eth0 inet static address 192
  • 云桌面pytorch的配置以及简单脚本的编写

    云桌面pytorch的配置以及简单脚本的编写 一 环境配置 1 更新pip 输入指令 python m pip install upgrade pip 2 配置Anaconda 用户管理python版本 1 进入官网找到选择版本 https
  • 大一python基础编程题答案,大一python期中考试试题

    一道简单的python编程题 255 按照题目要求编写的哥德巴赫猜想的Python程序如下def IsPrime v if v gt 2 for i in range 2 v 2 1 if v i 0 return False else r
  • QT 异步函数转为同步函数的方法

    QT 异步函数转为同步函数的方法 2010 11 18 17 29 13 转载 标签 eventloop 同步函数 异步函数 qt it 分类 C和Cpp 在QT中 一般推荐使用异步函数 除了异步函数的非阻塞特性外 QT的Signal Sl