2017-06-16 1 views
0

私は、基本的なWebサーバーを起動し、正常に動作する特定の入力に応答するPythonスクリプトを持っています。私はまた、Windowsのシステムトレイアイコンが働いている(icoファイルを表示している) - しかし、現時点ではスクリプトはシステムアイコンを表示する時点でブロックされているようだ。Python - HTTPサーバーを起動し、Windowsのシステムトレイを設定する

私はちょうどスクリプトの実行中に表示されているシステムトレイのアイコンを聞いているpython HTTPサーバーを持っています。これは既に隠されたpythonウィンドウです。何らかの理由で失敗した場合は知りたいのですが。

2つのスレッドを個別に開始する必要はありますか?またはこれを行うためのよりよい方法がありますか?

thread = threading.Thread(target = server.serve_forever()) 

しかしその後、サーバ起動ピースでブロックなし:

hover_text = "My Tray Icon Text" 
def hello(sysTrayIcon): print "Hello World." 
def simon(sysTrayIcon): print "Hello Simon." 
def switch_icon(sysTrayIcon): 
    pass 
menu_options = (('Say Hello', None, hello), 
       ('Switch Icon', None, switch_icon), 
       ('A sub-menu', None, (('Say Hello to Simon', None, simon), 
               ('Switch Icon', None, switch_icon), 
              )) 
       ) 
def bye(sysTrayIcon): 
    print ("Server stopped by user") 
    sys.exit() 
    # server.shutdown() 

print("setting system tray icon") 
SysTrayIcon("hazard.ico", hover_text, menu_options, on_quit=bye, default_menu_index=1) 

print("starting server") 


#local only 
#server = HTTPServer(('localhost', 9006), GetHandler) 

#listen on all interfaces 
server = HTTPServer(('0.0.0.0', 9006), GetHandler) 

#print 'Starting server, use to stop' 
server.serve_forever() 

は、私はこのような設定システムトレイアイコンの前にサーバーの開始を移動しようとした。ここに私の元のコード(抜粋のみ)でしたアイコンが設定されます。

また、私はこの

from SocketServer import ThreadingMixIn 

class ThreadingServer(ThreadingMixIn, HTTPServer): 
    pass 

srvr = ThreadingServer(('0.0.0.0', 9006), GetHandler) 
srvr.serve_forever() 

reference を試みたが、サーバーの作品でそれはまだブロック。

多分マルチスレッドではなくマルチプロセッシングを使用するべきでしょうか?スクリプトはかなり小さいです&簡単です。

答えて

0

私はSysTrayIcon()呼び出しがブロックされていると想定しています(この機能に慣れておらず、提供モジュールがコードサンプルにありません)。

もしそうなら、解決策の1つは別のスレッドでサーバーを起動することです。 スレッドに開始するとき、Thread()targetには、関数への参照を渡す必要があります。

だから、あなたが必要とするコードは次のようである:

server_thread = threading.Thread(target=server.serve_forever) 
server_thread.start() 

代わりの方法を呼び出します。コードサンプルでは、​​server.serve_foreverが呼び出されているため、ブロック(そのメソッドはHTTP要求を受け入れて処理するのを永久にブロックします)。

SocketServerからThreadingMixInを選択した場合でも、serve_foreverの呼び出しは別のスレッドで行う必要があります。 ThreadingMixInは、サーバーが別のスレッドで各HTTP要求を処理できるようにしますが、serve_foreverの呼び出しは現在のスレッドをブロックします。

また、アプリケーションが停止するときにサーバースレッド(たとえばthreading.Eventを使用)を停止する適切な方法について考えてみることをお勧めします。他のスレッドでSysTrayIcon()と呼ぶのは簡単です:

threading.Thread(target=SysTrayIcon, args=("hazard.ico", hover_text, menu_options), kwargs=dict(on_quit=bye, default_menu_index=1)) 
+0

ご回答ありがとうございます。申し訳ありませんが、トレーアイコンコードの参照リンクは次のとおりです。http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html 私はすでに関数への参照を使用していますが、まだmyThread1ではブロックしています。start() 私は引き続きこのことを試して、何ができるかを見ていきます。 はい、sysを心配する必要はありません。exitはプレースホルダだけでした。 ;-) – TheDavil

+0

私はあなたの2番目の編集も試してみました。彼らは何らかの理由でブロックします。私はこれについてすべて間違っていると感じているが、すぐにそれを把握するだろう – TheDavil

+0

私はPython Win32 APIの経験がないが、いくつかのGUIフレームワークではいくつかの操作にメインスレッドを使う必要がある。あなたはそのようなトリックを見つけるかもしれません。一般に、ブロッキングコールを検出してスレッドで開始すると、メインスレッドはブロックされません(スレッドがビジーループでないと、他のスレッドが適切に処理されなくなります)。 – farzad

関連する問題