Как я могу добавить прогресс для операции отправки сообщений (smtp) с API блокировки сокетов? - PullRequest
0 голосов
/ 05 июня 2018

Я использую API блокирующих сокетов (функции waitFor *) для отправки почты по протоколу smtp (это по модулю DLL).Все операции являются синхронными: connect->waitForConnected(timeout)->login->waitForReadyRead(timeout)->sendMessage->waitForBytesWritten(timeout) -> и т. Д.Я использую API блокировки, потому что требуется QCoreApplication отсутствие (DLL используется различными приложениями, в том числе не на основе qt).Блокирующие функции не требуют зацикливания событий и работают нормально.Но как я могу добиться визуального прогресса при длительной отправке почтовых операций (например, с большим вложением)?А как организовать обратные вызовы для уведомлений о прогрессе в sendmail DLL?ps: все блокирующие функции waitFor * помечены как функции, которые могут случайно произойти в Windows.Попробуйте использовать цикл обработки событий и сигнал readyRead(), если ваша программа будет работать в Windows.Почему?

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете определенно иметь экземпляр QApplication при использовании DLL (это должно быть QApplication, а не QCoreApplication, так как вы хотите графический интерфейс на основе виджетов).Он интегрируется в собственный цикл сообщений основного потока.Помните, что для запуска Qt Gui вам нужен только собственный цикл обработки событий - код не должен застрять в QCoreApplication::exec.Вам нужен экземпляр приложения, и вам нужно его заполнить, вызвав exec один раз и убедившись, что он возвращается (т. Е. Используя таймер нулевого времени ожидания), но это все.Кроме того, насос сообщений основного потока приложения будет обрабатывать вещи за вас.

Кроме того, для использования сетевых API-интерфейсов вам не нужно зацикливаться на главном потоке - вы можете обрабатывать их в отдельном потоке.

Ваша DLL не будет совместима с консольными приложениями, которые не запускают насос сообщений в главном потоке, но затем вы можете обмануть: в Windows и только в Windows QCoreApplication и его производныеклассы могут использоваться в любом потоке:)

Вы определенно должны либо статически связать вашу DLL с Qt, либо использовать динамически связанный Qt, который был помещен в уникальное пространство имен.Помните, что если приложение, с которым вы связываете, использует Qt, нет абсолютно никаких гарантий того, что созданный ими Qt совместим с бинарным кодом используемого вами Qt.Даже если это та же версия.

...