2009-08-13 19 views
0

基本的には、DeviceAdded DBusイベント(たとえば、誰かがUSBドライブを接続したとき)を聞くPythonプログラムがあります。イベントが発生すると、メタデータを収集するスレッドを作成しますその新しく接続されたデバイスにしかし、私はこれを非同期的に実行したい、つまり、あるスレッドがデバイス上でメタデータを収集し続ける一方で、親に制御を戻して、これらのイベントを引き続き聞くことができるようにしたい。現時点では、コレクションが終了するまでスレッドがブロックされます。ここに私のコードのサンプルです:Pythonのスレッディング質問を親に返す

class DeviceAddedListener: 
def __init__(self): 
    self.bus = dbus.SystemBus() 
    self.hal_manager_obj = self.bus.get_object("org.freedesktop.Hal", "/org$ 
    self.hal_manager = dbus.Interface(self.hal_manager_obj, "org.freedeskto$ 
    self.hal_manager.connect_to_signal("DeviceAdded", self._filter) 

def _filter(self, udi): 
    device_obj = self.bus.get_object ("org.freedesktop.Hal", udi) 
    device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device") 

    if device.QueryCapability("volume"): 
     return self.capture(device) 

def capture(self,volume): 
    self.device_file = volume.GetProperty("block.device") 
    self.label = volume.GetProperty("volume.label") 
    self.fstype = volume.GetProperty("volume.fstype") 
    self.mounted = volume.GetProperty("volume.is_mounted") 
    self.mount_point = volume.GetProperty("volume.mount_point") 
    try: 
     self.size = volume.GetProperty("volume.size") 
    except: 
     self.size = 0 

    print "New storage device detected:" 
    print " device_file: %s" % self.device_file 
    print " label: %s" % self.label 
    print " fstype: %s" % self.fstype 
    if self.mounted: 
     print " mount_point: %s" % self.mount_point 
    response = raw_input("\nWould you like to acquire %s [y/N]? " % self.device_file) 
    if (response == "y"): 
     self.get_meta() 
     thread.start_new_thread(DoSomething(self.device_file)) 
    else: 
     print "Returning to idle" 


if __name__ == '__main__': 
from dbus.mainloop.glib import DBusGMainLoop 
DBusGMainLoop(set_as_default=True) 
loop = gobject.MainLoop() 
DeviceAddedListener() 
loop.run() 

任意の考えをいただければ幸いです:)私はスペースを節約するためにインポートリストを除外しているが

+0

ビットを抽象化するときにサンプルコードを移動する方がずっと簡単です。 –

答えて

2

次を変更することで、ちょうど撮影のもののためのスレッドを生成してみこれまでご_filter()関数内の行:

if device.QueryCapability("volume"): 
    threading.start_new_thread(self.capture, (device)) 

これは、作業の大部分はcapture()機能で起こっていることを想定しています。もしそうでなければ、ちょうど少し早く、おそらく全体の_filter()関数にスレッドを生成してください。 これで、検出されたすべてのフィルタ処理されたデバイスに対して新しいスレッドが生成されます。私はdbusのものは何もしておらず、実際にこれをテストすることはできませんが、それは考えです。

また、キャプチャ機能からユーザー入力を取得しようとしています。キャプチャ機能では、定義したとおりにアプリケーションを使用してスレッドで行うのは本当に素晴らしいことではありません。最初のプロンプトが画面に表示されている間に2台目のデバイスが接続されている場合はどうなりますか?うまく再生できない場合があります。

このことのデザインは、特定の理由から、あなたが望むのとまったく同じかもしれませんが、たくさん滑りやすいような気分にはなりません。私の言うことから、スレッドを念頭に置いて設計されたものではありません。

関連する問題