Jruby: использование Pry с JRuby (и JRubyFx)

Как правильно использовать Pry gem с JRuby и JRubyFx в Windows?

Я использую JRubyFx (привязка JavaFX JRuby — https://github.com/jruby/jrubyfx) и для своего теста я использую этот пример, сжатый до минимально необходимые строки.

require 'jrubyfx'
require 'pry'

class SimpleFXApplication < JRubyFX::Application
    def start(stage)
    stage.title = "jrubyfx app"
    @ctrlr = SimpleFXController.load_fxml("some_fxml_code_for_ui.fxml", stage)
    stage.show
  end
end

class SimpleFXController < JRubyFX::Controller
end

SimpleFXApplication.launch
binding.pry

После запуска приложения консоль больше не принимает ввод, и «pry» возвращается, принимая ввод, только когда я закрываю окно SimpleFXApplication.

Я также пробовал использовать потоки Java:

...
binding.pry
Java.java.lang.Thread.new do SimpleFXApplication.launch end

Но затем, хотя новый идентификатор потока отображается как работающий, SimpleFXApplication никогда не запускается.

Еще одна вещь, которую я пробовал, — запустить pry из консоли, а затем потребовать и запустить SimpleFXApplication:

jruby -S pry

требуется './jrubyfx_demo.rb'

истинный

SimpleFXApplication.launch

И я получаю следующие ошибки...

Я предполагаю, что это как-то связано с тем, как JrubyFx использует потоки, или я не знаю, является ли это более общей проблемой, которая влияет на использование Pry с JRuby. Я хотел бы знать больше, я был бы признателен, если бы кто-то мог поделитесь советом.

SimpleFXApplication.launch никогда не возвращается до тех пор, пока не будет вызван Platform.exit (закрытие окон делает это в фоновом режиме)


person jj_    schedule 05.02.2013    source источник
comment
спасибо, я добавил код и лучшее описание проблемы.   -  person Hitham S. AlQadheeb    schedule 05.02.2013
comment
Каков полный путь к 'some_fxml_code_for_ui.fxml'?   -  person jj_    schedule 07.02.2013
comment
Путь был слишком вложенным для примера, поэтому я переместил «jrubyfx_demo.rb» и «some_fxml_code_for_ui.fxml» в «c:\example\app» и запустил оттуда тот же код, но получил те же результаты.   -  person Hitham S. AlQadheeb    schedule 07.02.2013
comment
Исключение при запуске приложения: java.net.MalformedURLException: неизвестный протокол: c .newInstance(неизвестный источник) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(неизвестный источник) java.lang.reflect.Constructor.newInstance(неизвестный источник) org.jruby.javasupport.JavaConstructor.newInstanceDirect(JavaConstructor.java:291) org.jruby. java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:104) org.jruby.java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:197) org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:211) org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:217) org.jruby.java.proxies.ConcreteJavaProxy$2.call(ConcreteJavaProxy.java:56) .java:211) org.jruby.runt ime.callsite.CachingCallSite.call(CachingCallSite.java:217) org.jruby.RubyClass.newInstance(RubyClass.java:862) org.jruby.RubyClass$INVOKER$i$newInstance.call(RubyClass$INVOKER$i$newInstance. gen) org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrOneOrTwoOrNBlock.call(JavaMethod.java:295) org.jruby.java.proxies.ConcreteJavaProxy$3.call(ConcreteJavaProxy.java:155) org.jruby.runtime.callsite .CachingCallSite.cacheAndCall(CachingCallSite.java:346) org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:204) org.jruby.ast.CallTwoArgNode.interpret(CallTwoArgNode.java:59) org.jruby.ast .NewlineNode.interpret(NewlineNode.java:105) org.jruby.ast.BlockNode.interpret(BlockNode.java:71) org.jruby.ast.IfNode.interpret(IfNode.java:118) org.jruby.ast.AttrAssignOneArgNode .interpret(AttrAssignOneArgNode.java:33) org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105) org.jruby.ast.BlockNode.interpret(BlockNode.java:71) org.jruby.evaluator.ASTInterpre ter.INTERPRET_METHOD(ASTInterpreter.java:75) org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:268) org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:220) org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:366) org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:238) 40) org.jruby.ast.LocalAsgnNode.interpret(LocalAsgnNode.java:123) org.jruby.ast. NewlineNode.interpret(NewlineNode.java:105) org.jruby.ast.BlockNode.interpret(BlockNode.java:71) org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75) org.jruby.internal.runtime. методы.InterpretedMethod.call(InterpretedMethod.java:225) org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:204) org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:346) org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:204) org.jruby.ast.CallTwoArgNode.interpret(CallTwoArgNode.java:59) org.jruby.ast.InstAsgnNode.interpret(InstAsgnNode.java:95) org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105) org.jruby.ast.BlockNode.interpret(BlockNode.java:71) org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75) org. jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:182) org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:188) org.jr uby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:326) org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170) org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57) org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105) org.jruby.ast.BlockNode.interpret(BlockNode.java:71) org.jruby.ast.RescueNode.executeBody(RescueNode.java:224) org. jruby.ast.RescueNode.interpret(RescueNode.java:119) org.jruby.ast.BeginNode.interpret(BeginNode.java:83) org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105) org.jruby. Evaluator.ASTInterpreter.INTERPRET_BLOCK(ASTInterpreter.java:112) org.jruby.runtime.Interpreted19Block.evalBlockBody(Interpreted19Block.java:209) org.jruby.runtime.Interpreted19Block.yield(Interpreted19Block.java:197) org.jruby.runtime. Interpreted19Block.call(Interpreted19Block.java:128) org.jruby.runtime.Block.call(Block.java:89) org.jruby.RubyProc.call(RubyProc.java:261) org.jruby.RubyProc.call(RubyProc. да va:213) org.jruby.javasupport.JavaUtil$1.call(JavaUtil.java:237) org.jruby.javasupport.util.RuntimeHelpers$MethodMissingMethod.call(RuntimeHelpers.java:445) org.jruby.gen.InterfaceImpl1014569521.run (org/jruby/gen/InterfaceImpl1014569521.gen:13) com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) 179) com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) java.security. AccessController.doPrivileged(собственный метод) com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) com.sun.glass.ui.win.WinApplication._runLoop(собственный метод) com.sun.glass.ui .win.WinApplication.access$100(WinApplication.java:29) com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) java.lang.Thread.run(Неизвестный источник) => nil   -  person jj_    schedule 13.02.2013


Ответы (2)


Чтобы сделать то, что вы пытаетесь сделать, разветвите метод запуска или какой-либо другой метод таймера после того, как JavaFX запустит приложение.

Как один из разработчиков JRubyFX, я также могу рассказать вам, как работает многопоточность в JRubyFX/JavaFX:

основной поток порождает поток JavaFX пользовательского интерфейса и ожидает блокировки от потока JavaFX

  1. Поток пользовательского интерфейса запускает кучу вещей платформы
  2. Поток пользовательского интерфейса вызывает начало (этап)
  3. start(stage) устанавливает обработчики событий, пользовательский интерфейс и т. д. (здесь вы должны запустить pry)
  4. пользователь вызывает stage.show для запуска событий JavaFX (щелчок, перемещение мыши, нажатие клавиши, свертывание и т. д.)
  5. поток событий обращается к потоку пользовательского интерфейса с обработчиками событий
  6. Пользователь сигнализирует, щелкнув [x] или вызвав Platform.exit, что он хочет закрыть JavaFX.
  7. stage.show получает блокировку события и возвращает
  8. Поток пользовательского интерфейса снимает блокировку основного потока.
  9. Поток пользовательского интерфейса очищается, пока основной поток продолжается
  10. В соответствии с этим:
person byteit101    schedule 13.02.2013

Исключение при запуске приложения: java.net.MalformedURLException: неизвестный протокол: c java.net.URL.(неизвестный источник) java.net.URL.(неизвестный источник)

Есть ли в вашем файле конфигурации что-то, указывающее расположение файлов? Если да, то какая там ценность?

Если вы используете «C: [что-то]», а C — ваш текущий диск, я бы посоветовал попробовать удалить «C:», если pry путается с буквой диска.

-- Кит

Покажите код, который вы использовали, пожалуйста.

person Keith Bennett    schedule 04.03.2013