2010-01-18 3 views
1

windows 기반 데스크톱 응용 프로그램에 웹 인터페이스를 제공하고 그 반대의 경우도 마찬가지입니다. 내 데스크탑 응용 프로그램은 wxRuby로 작성되었으며 웹 서버는 Sinatra (webrick 사용)입니다. 가장 간단한 아이디어는 이들을 서로 매쉬하는 것이었지만, 이것은 효과가 없습니다.데스크탑 응용 프로그램에 웹 서버를 포함 시키십시오 : wxRuby 및 Sinatra

이 코드는 작동하지 않습니다. 웹 서버와 GUI 응용 프로그램은 동시에 실행되지 않습니다. 데스크톱 응용 프로그램이 먼저 실행 된 다음 닫힌 후에 실행됩니다. sinatra가 시작됩니다.

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 

다시. 데스크톱 응용 프로그램은 닫힐 때까지 실행되고 웹 서버가 시작됩니다.

조언을 보내지 만 한 가지 절차 만 알고 싶습니다. 솔루션이 두 가지 프로세스 인 경우; 폴링이 필요없는 강력한 프로세스 간 통신을 원합니다.

감사! Jeff

답변

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 
0

bowline을 사용할 수 있지만 아직 사용하지 않았습니다.

+0

xx. 그들은 잠시 이상한 스레드 문제가 있었고, 다시 점검해야합니다. – jrhicks

관련 문제