トップ «前の日記(2002-08-27) 最新 次の日記(2002-08-31)» 月表示 編集

日々の流転


2002-08-28 [長年日記]

λ. 読書

『ギルティギアゼクス - 胡蝶と疾風』
海法紀光

国際警察機構長官!?。なにー、カイはそんなに偉かったのかぁー

Tags:

λ. DRb vs Gtk::Plug & Gtk::Socket

なかださんが「面白そう」と言ってくれたので、試しに簡単なものを作ってみる。細かなエラー処理などは省略。

# drbembed.rb
require 'drb'
require 'gtk2'
 
module DRbEmbed
  class Socket < Gtk::Socket
    def initialize
      super()
      @drbobj = nil
    end
 
    def add(arg)
      @drbobj = arg
      add_id(@drbobj.__drb_embed_plug_id__)
    end
  end
end
 
module Gtk
  class Widget
    def __drb_embed_plug_id__
      if parent
        unless parent.is_a? Gtk::Plug
          raise TypeError.new("parent isn't Gtk::Plug")
        end
      else
        Gtk::Plug.new.show.add(self)
      end
      parent.id
    end
  end
end

次に埋め込まれるWidgetの例。DRbを普通に使ってるだけ。

require 'drbembed'
server = DRb::DRbServer.new(nil, Gtk::Button.new('This is remote widget'))
puts server.uri
Gtk.main

で、このWidgetをリモートから使ってみる。コンテナとしてDRbEmbed::Socketを使う事以外、ほとんど何も気にしなくて良いはず。

require 'drbembed'
 
there = ARGV.shift || raise("usage: #{$0} <server_uri>")
DRb.start_service(nil, nil)
remote_widget = DRb::DRbObject.new(nil, there)
 
win = Gtk::Window.new
socket = DRbEmbed::Socket.new
win.add(socket)
win.show_all
 
socket.add(remote_widget)
remote_widget.show
 
remote_widget.signal_connect('clicked'){
  puts 'Hello DRb!'
}
 
Gtk.main

う〜ん。もう少し改良の余地があるかな。

Tags: ruby