Как не заклинить потоки ruby ​​при использовании OSX Cocoa FFI?

Отслеживая проблемы с многопоточностью при разработке приложений для настольных компьютеров, я выделил одну из нескольких проблем с многопоточностью, которые я хотел бы избежать, чтобы, надеюсь, довести мир до такой степени, что реальная разработка приложений на ruby ​​возможна даже удаленно.

И этот конкретный случай оказался довольно простым для иллюстрации, но я действительно мог использовать информацию о том, как его решить.

Мне кажется, что запуск NSApplication нарушает механизмы потоков в ruby. И вопрос просто - как этого избежать?

Следующие выводы:

ping
ping
and thats the end of ruby threading - no more pings, goodbye!!

Тогда не более..

require 'ffi'

module ObjC
  extend FFI::Library

  ffi_lib 'objc'

  attach_function :sel_registerName, [:string], :pointer
  attach_function :objc_msgSend, [:pointer, :pointer, :varargs], :pointer
  def self.msgSend( id, selector, *args )
    selector = sel_registerName(selector) if selector.is_a? String
    return objc_msgSend( id, selector, *args )
  end
  attach_function :objc_getClass, [:string], :pointer
end

module Cocoa
  extend FFI::Library

  ffi_lib '/System/Library/Frameworks/Cocoa.framework/Cocoa'

  attach_function :NSApplicationLoad, [], :bool
  NSApplicationLoad()
 end

pool = ObjC.msgSend(ObjC.msgSend(ObjC.objc_getClass("NSAutoreleasePool"),"alloc"),"init")
application = ObjC.msgSend(ObjC.objc_getClass("NSApplication"),"sharedApplication")

Thread.new do
  loop do
    sleep 1
    puts "ping"
  end
end

sleep 3

puts "and thats the end of ruby threading - no more pings, goodbye!!"

ObjC.msgSend(application,"run")

0 ответов

Другие вопросы по тегам