Как не заклинить потоки 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")