基本的には、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()
任意の考えをいただければ幸いです:)私はスペースを節約するためにインポートリストを除外しているが
ビットを抽象化するときにサンプルコードを移動する方がずっと簡単です。 –