[prev in list] [next in list] [prev in thread] [next in thread]
List: freedesktop-dbus
Subject: [python-dbus/PyQt] Message loops in separate threads
From: dwelch91 <dwelch91 () gmail ! com>
Date: 2007-12-17 3:30:19
Message-ID: 5c9a36e80712161930p1179c374lb353e516547d5ab5 () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
So, as a follow up to the PyQt/python-dbus issue connecting to both the
session and system buses, should it be possible to place each messsge loop
(Glib and PyQt) in a separate thread? Here's my naive attempt at this (that
doesn't work). I guess I don't understand enough about the message loops to
know whether this is completely misguided or not...
Thanks,
Don
----------------------------------------
#! /usr/bin/env python
import sys, threading
import Queue
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from gobject import MainLoop
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt
class Test(dbus.service.Object):
def __init__(self,update_queue, name, object_path):
dbus.service.Object.__init__(self, name, object_path)
self.update_queue = update_queue
@dbus.service.method('com.hplip.StatusService')
def EchoString(self, s):
return s
class DBusThread(threading.Thread):
def __init__(self, update_queue):
threading.Thread.__init__(self)
self.update_queue = update_queue
def run(self):
dbus_loop = DBusGMainLoop(set_as_default=False)
self.system_bus = dbus.SystemBus(mainloop=dbus_loop)
self.session_bus = dbus.SessionBus(mainloop=dbus_loop)
self.system_bus.add_signal_receiver(self.handle_system_signal,
sender_keyword='sender',
destination_keyword='dest', interface_keyword='interface',
member_keyword='member', path_keyword='path')
self.session_name = dbus.service.BusName("com.hplip.StatusService",
self.session_bus)
self.test_object = Test(self.update_queue, self.session_name,
"/com/hplip/StatusService/Test")
print "Running dbus loop..."
MainLoop().run()
print "dbus loop exit."
def handle_system_signal(*args,**kwds):
print args
print kwds
def main(args):
app = QtGui.QApplication(sys.argv)
tray_icon = QtGui.QSystemTrayIcon()
icon = QtGui.QIcon("HPmenu.png")
tray_icon.setIcon(icon)
menu = QtGui.QMenu()
menu.addAction("&Quit", quit, Qt.CTRL + Qt.Key_Q)
tray_icon.setContextMenu(menu)
tray_icon.show()
update_queue = Queue.Queue() # unfinished
dbus_thread = DBusThread(update_queue)
dbus_thread.start()
print "Running Qt mainloop..."
app.exec_()
print "qt loop exit"
if __name__ == '__main__':
sys.exit(main(sys.argv))
[Attachment #5 (text/html)]
So, as a follow up to the PyQt/python-dbus issue connecting to both the session and system \
buses, should it be possible to place each messsge loop (Glib and PyQt) in a separate thread? \
Here's my naive attempt at this (that doesn't work). I guess I don't understand \
enough about the message loops to know whether this is completely misguided or not... \
<br><br>Thanks,<br><br>Don<br><br><br>----------------------------------------<br>#! \
/usr/bin/env python<br><br>import sys, threading<br>import Queue<br><br>import dbus<br>import \
dbus.service<br>from dbus.mainloop.glib import DBusGMainLoop <br>from gobject import \
MainLoop<br><br>from PyQt4 import QtGui, QtCore<br>from PyQt4.QtCore import \
Qt<br><br><br> <br>class Test(dbus.service.Object):<br> def \
__init__(self,update_queue, name, object_path):<br> \
dbus.service.Object.__init__(self, name, object_path)<br> \
self.update_queue = update_queue<br> \
<br> \
@dbus.service.method('com.hplip.StatusService')<br> def \
EchoString(self, s):<br> return s <br> \
<br><br>class DBusThread(threading.Thread):<br> def __init__(self, \
update_queue):<br> \
threading.Thread.__init__(self)<br> self.update_queue = \
update_queue<br> <br> def \
run(self):<br> dbus_loop = \
DBusGMainLoop(set_as_default=False) <br><br> \
self.system_bus = dbus.SystemBus(mainloop=dbus_loop)<br> \
self.session_bus = dbus.SessionBus(mainloop=dbus_loop)<br> \
<br> \
self.system_bus.add_signal_receiver(self.handle_system_signal, sender_keyword='sender', \
<br> \
destination_keyword='dest', interface_keyword='interface', \
<br> member_keyword='member', \
path_keyword='path')<br> \
<br> self.session_name = dbus.service.BusName \
("com.hplip.StatusService", self.session_bus)<br> \
self.test_object = Test(self.update_queue, self.session_name, \
"/com/hplip/StatusService/Test")<br> \
<br> print "Running dbus loop..." \
<br> MainLoop().run()<br> \
print "dbus loop exit."<br><br> \
<br> def \
handle_system_signal(*args,**kwds):<br> print \
args<br> print kwds<br> \
<br> <br>def main(args): \
<br> app = QtGui.QApplication(sys.argv)<br><br> tray_icon = \
QtGui.QSystemTrayIcon()<br> icon = QtGui.QIcon("HPmenu.png") \
<br> tray_icon.setIcon(icon)<br> menu = \
QtGui.QMenu()<br> menu.addAction ("&Quit", quit, Qt.CTRL + \
Qt.Key_Q)<br> tray_icon.setContextMenu(menu)<br><br> \
tray_icon.show()<br><br> update_queue = Queue.Queue() # unfinished \
<br><br> dbus_thread = DBusThread(update_queue)<br> \
dbus_thread.start()<br><br> print "Running Qt \
mainloop..."<br> app.exec_()<br> print "qt loop \
exit"<br><br><br>if __name__ == '__main__':<br> \
sys.exit(main(sys.argv))<br>
_______________________________________________
dbus mailing list
dbus@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dbus
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic