我正在使用阻塞套接字 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/