Встроить веб-сервер в настольное приложение: wxRuby и Sinatra
Я хотел бы предоставить моим настольным приложениям на базе Windows веб-интерфейс и наоборот. Мое настольное приложение написано на wxRuby, а веб-сервер - Sinatra (использующий webrick). Самая простая идея была просто собрать их вместе, это не работает.
Этот код не работает. Веб-сервер и приложение GUI не работают одновременно. Настольное приложение запускается сначала, а затем после его закрытия; Синатра начинается.
require 'wx'
require 'sinatra'
configure do set :server, 'webrick' end
get '/' do
"Sinatra says hello"
end
class MyApp < Wx::App
def on_init
@frame = Wx::Frame.new( nil, -1, "Application" )
@frame.show
end
end
app = MyApp.new
app.main_loop
Поэтому я подумал об изменении двух последних строк на
Thread.new do
app = MyApp.new
app.main_loop
end
Снова. Настольное приложение работает до закрытия, затем запускается веб-сервер. Поэтому я попытался запустить Синатру в теме.
Thread.new do
require 'sinatra'
configure do set :server, 'webrick' end
get '/' do
"Sinatra says hello"
end
end
require 'wx'
class MyApp < Wx::App
def on_init
@frame = Wx::Frame.new( nil, -1, "Application" )
@frame.show
end
end
app = MyApp.new
app.main_loop
Снова. Настольное приложение работает до закрытия, затем запускается веб-сервер.
Пожалуйста, посоветуйте, но имейте в виду, что я действительно хотел бы иметь только один процесс. Если ваше решение состоит из двух процессов; Я хотел бы сильное межпроцессное взаимодействие, которое не требует опроса.
Спасибо! Джефф
2 ответа
Это по крайней мере запускается, не уверен, если это нарушает некоторые правила потоков.
require 'win32/process'
require 'sinatra/base'
class MyWebServer < Sinatra::Base
get '/' do
'Hello world!'
end
end
Thread.new do
MyWebServer.run! :host => 'localhost', :port => 4567
end
require 'wx'
class MyGui < Wx::App
def on_init
t = Wx::Timer.new(self, 55)
evt_timer(55) { Thread.pass }
t.start(1)
evt_idle { Thread.pass }
@frame = Wx::Frame.new( nil, -1, "Application" )
@frame.show
true
end
end
app = MyGui.new
app.main_loop