线程A:运行Gtkmm消息循环的UI线程.
线程B:通过网络接收数据并将其记录到文件中.
现在我希望将相同的数据转储到线程B中的文件中,同时也要在UI上的Gtk :: TextView中显示.最好的方法是什么?
Glib :: Dispatcher不会获取数据.因此,只有通知工作完成才有用.
libSigCX让我伤心.
所以我尝试了 boost::asio 并测试了阻塞回声示例。他们似乎并没有完全阻止它。至少不像我预期的那样。
是否可以摆脱任何类型的缓冲或您可以拥有的最小缓冲区大小是多少?看起来 10000 字节太小了。
以下代码在阻塞之前运行了 2 次写入。如果我将 boost::asio::transfer_exactly(10000) 参数添加到写入中,它仍然是 2。 boost::asio::transfer_exactly(5000) 让我得到 5 次写入。
那么这个networking/io/asio 的东西是如何工作的呢?就像我只想发送一个字节并等待它到达另一端,而没有任何额外的通信。
服务器:
boost::asio::io_service io_service;
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), 12346));
tcp::socket sock(io_service);
a.accept(sock);
sock.non_blocking(false);
boost::asio::socket_base::send_buffer_size option(10000);
sock.set_option(option);
while(true) {
char data[10000];
boost::asio::socket_base::bytes_readable bytes_readable_cmd(true);
sock.io_control(bytes_readable_cmd);
std::size_t bytes_readable = bytes_readable_cmd.get();
if(bytes_readable) {
/**/
}
boost::asio::write(sock, boost::asio::buffer(data, 10000));
printf("#\n");Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)
客户:
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "12346");
tcp::resolver::iterator iterator = resolver.resolve(query);
tcp::socket sock(io_service);
boost::asio::connect(sock, iterator);
sock.non_blocking(false);
Run Code Online (Sandbox Code Playgroud)