小编Sam*_*kus的帖子

Boost ASIO:异步写入,同步

我有一个程序(客户端 + 服务器),可以正常使用此写入:

boost::asio::write(this->socket_, boost::asio::buffer(message.substr(count,length_to_send)));
Run Code Online (Sandbox Code Playgroud)

哪里socket_boost::asio::ssl::stream<boost::asio::ip::tcp::socket>并且messagestd::string

我想让它变得更好和非阻塞,所以我创建了一个可以替换它的函数,它的调用方式如下:

write_async_sync(socket_,message.substr(count,length_to_send));
Run Code Online (Sandbox Code Playgroud)

这个函数的目的是:

  1. 为了使调用异步,本质上
  2. 保持界面不变

我实现的函数只是使用 promise/future 来模拟同步行为,我稍后(在它工作后)将修改为可取消:

std::size_t 
SSLClient::write_async_sync(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& socket, 
                            const std::string& message_to_send)
{
    boost::system::error_code write_error;
    std::promise<std::size_t> write_promise;
    auto write_future = write_promise.get_future();

    boost::asio::async_write(socket,
                             boost::asio::buffer(message_to_send), 
        [this,&write_promise,&write_error,&message_to_send]
        (const boost::system::error_code& error,
        std::size_t size_written)
        {
            logger.write("HANDLING WRITING");
            if(!error)
            {
                write_error = error;
                write_promise.set_value(size_written);
            }
            else
            {
                write_promise.set_exception(std::make_exception_ptr(std::runtime_error(error.message())));
            }
        });
    std::size_t size_written = write_future.get();
    return size_written;
}
Run Code Online (Sandbox Code Playgroud)

问题:我无法使用异步功能。sync 工作正常,但 async 只是冻结并且永远不会进入 lambda 部分(写入永远不会发生)。我究竟做错了什么?


编辑:我意识到 usingpoll_one()使函数执行并继续,但我不明白。这是我如何打电话run()io_service …

c++ boost asynchronous boost-asio c++11

6
推荐指数
1
解决办法
1259
查看次数

PyQt:在 QMessageBox 之后退出 QSystemTrayIcon 程序

我有一个主要基于QSystemTrayIcon. 一切正常,右键单击任务栏图标有一个退出程序的选项。我想添加一个QMessageBox,然后选择“是”,退出程序;否则,什么也不做。

我对这一切都很熟悉,但它并没有发挥应有的作用,因此就有了这个问题。我创建了一个最小的示例来演示该问题:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        self.menu = QtWidgets.QMenu(parent)
        self.exit_action = self.menu.addAction("Exit")
        self.setContextMenu(self.menu)
        self.exit_action.triggered.connect(self.slot_exit)

        self.msg_parent = QtWidgets.QWidget()

    def slot_exit(self):
        reply = QtWidgets.QMessageBox.question(self.msg_parent, "Confirm exit",
                                               "Are you sure you want to exit Persistent Launcher?",
                                               QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
        # if reply == QtWidgets.QMessageBox.Yes:
        #     QtCore.QCoreApplication.exit(0)


def main():
    app = QtWidgets.QApplication(sys.argv)

    tray_icon = SystemTrayIcon(QtGui.QIcon("TheIcon.png"))

    tray_icon.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

现在您可以看到,在该slot_exit()函数中,无论我选择“是”还是“否”,程序都会退出(代码为 0,没有错误)。注释部分是我期望用于根据选择确定操作的部分。您能否帮我弄清楚为什么会发生这种行为以及仅在“是”时退出的正确方法是什么?

我使用的是 …

python taskbar pyqt python-3.x pyqt5

4
推荐指数
1
解决办法
499
查看次数

标签 统计

asynchronous ×1

boost ×1

boost-asio ×1

c++ ×1

c++11 ×1

pyqt ×1

pyqt5 ×1

python ×1

python-3.x ×1

taskbar ×1