Встроить веб-сервер в настольное приложение: wxRuby и Sinatra - PullRequest
1 голос
/ 18 января 2010

Я хотел бы предоставить моим настольным приложениям на основе 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 ]

2 голосов
/ 19 января 2010

Это как минимум запускается, не уверен, нарушает ли это некоторые правила многопоточности.

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
0 голосов
/ 28 февраля 2011

Вы можете использовать Bowline , но я еще не использую его.

...