在Ruby中螺纹锁固(使用SOAP4R及QT)(Thread Locking in Ruby (us

2019-10-17 22:15发布

[编辑注:发现我已经把创建互斥量在构造函数中。 移动它,并注意到没有变化。]

[编辑注2:我改变该呼叫并在试运行app.exec到

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

我注意到,一旦SOAP4R服务开始运行没有处理事件曾经得到又打电话]

[编辑注3:此创建一个相关的问题: 线程锁定在红宝石SOAP4R

我试图写入接收SOAP命令绘制监视器(因此允许远程监控访问)上的红宝石程序。 我已经把一个简单的测试应用程序原型的想法。 图形工具包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>
在锁
接电话
0
#<Qt::MainWindow:0x60fea28>
这:1--
在锁
这:2--
失锁

在这一点上我挂而不是总的五个增加我希望recieving。 Qt的不显示由 “CreateWindow的(10,0,10,10)” 和 “CreateWindow的(10,10,10,10)” 中定义的正方形。 鉴于“这个:1--”和“此:2--”一nexted输入/输出锁对我假设我使用互斥可怕的错误中显示。 这是我第一次与红宝石线程。

文章来源: Thread Locking in Ruby (use of soap4r and QT)