1

Windowsベースのデスクトップ アプリケーションに Web インターフェイスを提供したいと考えています。また、その逆も可能です。私のデスクトップ アプリケーションは wxRuby で作成され、Web サーバーは Sinatra (webrick を使用) です。最も単純なアイデアは、それらを一緒にマッシュアップすることでしたが、これはうまくいきません。

このコードは機能しません。Web サーバーと 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

そこで、最後の2行を次のように変更することを考えました

Thread.new do
    app = MyApp.new
    app.main_loop
end

また。デスクトップ アプリは閉じられるまで実行され、その後 Web サーバーが開始されます。そこで、Sinatra をスレッドで開始してみました。

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

また。デスクトップ アプリは閉じられるまで実行され、その後 Web サーバーが開始されます。

アドバイスをお願いしますが、プロセスを 1 つだけにしたいということを覚えておいてください。 ソリューションが 2 つのプロセスである場合。ポーリングを必要としない強力なプロセス間通信が必要です。

ありがとう!ジェフ

4

2 に答える 2

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
于 2010-01-19T05:17:52.817 に答える
0

bowlineを使用できますが、まだ使用していません。

于 2011-02-28T17:22:13.520 に答える