c++ - 如何使用阻塞套接字 API 添加消息发送操作 (smtp) 的进度?

标签 c++ qt sockets smtp qtnetwork

我正在使用阻塞套接字 API(waitFor* 函数)通过​​ smtp 协议(protocol)(它是一个 DLL 模块)发送邮件。所有操作都是同步的:connect->waitForConnected(timeout)->login->waitForReadyRead(timeout)->sendMessage->waitForBytesWritten(timeout)->等。 我正在使用阻塞 API,因为需要缺少 QCoreApplication(不同应用程序使用的 DLL,包括非基于 qt 的应用程序)。阻塞函数不需要事件循环,它工作正常。 但是对于长期的发送邮件操作(例如,带有大附件),我如何才能使进度可视化? 以及如何在 sendmail DLL 中组织进度通知的回调? ps:所有阻塞的 waitFor* 函数都标记为 功能,在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和 readyRead() 信号。 为什么?

最佳答案

当使用 DLL 时,你绝对可以有一个 QApplication 实例(它必须是 QApplication 而不是 QCoreApplication 因为你想要一个基于 widget 的 gui) .它集成到主线程的本地消息循环中。请记住,要运行 Qt Gui,您只需要一个 native 事件循环 - 代码不必卡在 QCoreApplication::exec 中。您需要应用程序的一个实例,并且需要通过调用一次 exec 来启动它,并确保它返回(即通过使用零超时计时器),仅此而已。之后,应用程序的主线程的消息泵将为您处理事情。

此外,要使用网络 API,您无需停留在主线程中 - 您可以在单独的线程中处理它们。

您的 DLL 将与不在主线程中运行消息泵的控制台应用程序不兼容,但是您可以作弊:在 Windows 上,并且仅在 Windows 上,QCoreApplication 和它的派生类可以在任何线程中使用:)

绝对必须要么将您的 DLL 与 Qt 静态链接,要么使用放置在唯一命名空间中的动态链接的 Qt。请记住,如果您链​​接的应用程序使用 Qt,则绝对不能保证他们构建的 Qt 与您使用的 Qt 二进制兼容。即使是相同的版本。

关于c++ - 如何使用阻塞套接字 API 添加消息发送操作 (smtp) 的进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50699559/

相关文章:

C: UDP 数据包源 Ip 伪造 - 无法接收数据包

c++ - QObject::connect: 无法对类型为 'QVector<int>' 的参数进行排队

c - 如何将我的服务器作为守护进程运行?

c++ - ./configure使用ssldump代码库抛出错误

C++ - 未解析的外部符号

c++ - 如何在支持 C++11 的 Windows 上安装 64 位 Qt?

c++ - QVariantList追加

c++ - 从客户端接收消息时如何解决窗口卡住问题(无响应)?

c++ - 等待线程结束 (C++)

C++/Qt如何声明和初始化一个全局对象数组