1

[メモの編集:コンストラクターにミューテックスの作成を入れたことに気づきました。動かして、変化がないことに気づきました。]

[注2を編集:試運転でapp.execの呼び出しをに変更しました

while TRUE do
    app.processEvents()
    puts '."
end

Soap4rサービスの実行が開始されると、プロセスイベントが再度呼び出されることはないことに気付きました]

[注3を編集:ここに関連する質問を作成しました:Soap4rを使用したルビーのスレッドロックアップ

モニターに描画するSOAPコマンドを受信するrubyプログラムを作成しようとしています(したがって、リモートモニターアクセスが可能になります)。アイデアのプロトタイプを作成するための簡単なテストアプリをまとめました。グラフィックツールキットはQTです。ロックに問題があると思います。示されているコードで、サーバーのメソッドをテストするための呼び出しを追加しました。私が今テストしているサーバー側は次のとおりです。

require 'rubygems'
require 'Qt4'
require 'thread'
require 'soap/rpc/standaloneserver'

class Box < Qt::Widget
 def initialize(parent = nil)
  super
  setPalette(Qt::Palette.new(Qt::Color.new(250,0,0)))
  setAutoFillBackground(true)
  show
 end
end

class SOAPServer < SOAP::RPC::StandaloneServer
    @@mutex = Mutex.new

 def initialize(* args)
  super

  # Exposed methods
  add_method(self, 'createWindow', 'x', 'y', 'width', 'length')

 end

 def createWindow(x, y, width, length)
  puts 'received call'
  windowID = 0
  puts @boxList.length
  puts @parent

  @@mutex.synchronize do
   puts 'in lock'
   box = Box.new(@parent)
   box.setGeometry(x, y, width, length)

   windowID = @boxList.push(box).length
   print "This:", windowID, "--\n"
  end
  puts 'out lock'
  return windowID
 end

 def postInitialize (parent)
  @parent = parent
  @boxList = Array.new
 end
end


windowSizeX = 400
windowSizeY = 300

app = Qt::Application.new(ARGV)
mainwindow = Qt::MainWindow.new
mainwindow.resize(windowSizeX, windowSizeY)
mainwindow.show

puts 'Attempting server start'

myServer = SOAPServer.new('monitorservice', 'urn:ruby:MonitorService', 'localhost', 4004)
myServer.postInitialize(mainwindow)
Thread.new do
 puts 'Starting?'
 myServer.start
 puts 'Started?'
end

Thread.new do
 myServer.createWindow(10,0,10,10)
 myServer.createWindow(10,30,10,10)
 myServer.createWindow(10,60,10,10)
 myServer.createWindow(10,90,10,10)
end

myServer.createWindow(10,10,10,10)

Thread.new do
 app.exec
end

gets

これを実行すると、次の出力が得られます。

サーバーを起動しようとしています
か?
受信コール
0
#<Qt::MainWindow:0x60fea28>
インロック
受信コール
0This
#<Qt::MainWindow:0x60fea28>
:1--
インロック
This:2--
アウトロック

その時点で、私が期待する合計5つの追加を受け取るのではなく、ハングします。Qtは、「createWindow(10,0,10,10)」および「createWindow(10,10,10,10)」で定義された正方形を表示します。「This:1--」と「This:2--」が次のイン/アウトロックペア内に表示されることを考えると、ミューテックスをひどく間違って使用していると思います。Rubyでスレッド化するのはこれが初めてです。

4

0 に答える 0