Ruby GTK 覚え書き
これは使えそう。STDIN を必要なファイルディスクリプタにすればよい。
require 'bundler/setup' require 'gtk2' w = Gtk::Window.new w.set_size_request(200, 50) w.set_resizable(false) b = Gtk::VBox.new w.add(b) entry = Gtk::Entry.new entry.set_editable(false) b.pack_start(entry) ioc = GLib::IOChannel.new(STDIN) ioc.add_watch(GLib::IOChannel::IN) do |io| st = io.readline.chomp entry.set_text(st) true #繰り返す end context = GLib::MainContext.default mainloop = GLib::MainLoop.new(context, true) w.signal_connect("destroy") {mainloop.quit} w.show_all mainloop.run ioc.close
参考:
https://github.com/taf2/ruby-gnome2/blob/master/glib/sample/iochannel.rb#L24
C言語/GTKでファイルやらソケットやらのfdが読み込み(or書き込み)可能になるのを待ちたい。 - BlankTar
サンプル(9/17)
サーバー側。こちらが先に起動。
require 'bundler/setup' require 'gtk2' require 'socket' module Sample class MyWindow < Gtk::Window def initialize super("Sample") set_size_request(200, 60) set_resizable(false) entry = Gtk::Entry.new entry.set_editable(false) entry.set_height_request(40) entry.modify_font(Pango::FontDescription.new("13")) add(entry) io = (ARGV[0] == "-s") ? TCPServer.open(29753) : STDIN Thread.new(io) do |io| ioc = GLib::IOChannel.new((io.class == IO) ? io : io.accept) ioc.add_watch(GLib::IOChannel::IN) do |i| st = i.gets next unless st entry.set_text(st.chomp) true #繰り返し end end signal_connect("destroy") {Gtk.main_quit} show_all end end def self.run MyWindow.new Gtk.main end end Sample.run
クライアント側。
require 'socket' TCPSocket.open("localhost", 29753) do |sock| st = "Hello, World!" st.length.times do |i| sock.puts st[0, i + 1] sleep(1) end end
単純にこんなのでも。
require 'socket' TCPSocket.open("localhost", 29753) do |sock| loop {sock.puts(gets)} end