[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