Форум сайта python.su
Ковыряю потоки QT: взял пример отсюда http://www.informit.com/articles/article.aspx?p=30708&seqNum=5
Подскажите пожалуйста, почему не работает? (делаю вместо qt - PyQt4, но жалуется на QThread)
import sys, time, random
from qt import *
rand = random.Random()
class WorkerThread(QThread):
def __init__(self, name, receiver):
QThread.__init__(self)
self.name = name
self.receiver = receiver
self.stopped = 0
def run(self):
while not self.stopped:
time.sleep(rand.random() * 0.3)
msg = rand.random()
event = QCustomEvent(10000)
event.setData(“%s: %f” % (self.name, msg))
QThread.postEvent(self.receiver, event)
def stop(self):
self.stopped = 1
class ThreadExample(QMultiLineEdit):
def __init__(self, *args):
QMultiLineEdit.__init__(self, *args)
self.setCaption(“Threading Example”)
self.threads =
for name in :
t = WorkerThread(name, self)
t.start()
self.threads.append(t)
def customEvent(self,event):
if event.type() == 10000:
s = event.data()
self.append(s)
def __del__(self):
for t in self.threads:
running = t.running()
t.stop()
if not t.finished():
t.wait()
app = QApplication(sys.argv)
threadExample = ThreadExample()
app.setMainWidget(threadExample)
threadExample.show()
sys.exit(app.exec_loop())
С уважением
Офлайн
Разобрался! Нужен такой заголовок:
import sys
from PyQt4 import QtCore, QtGui
Извините, а никто не подскажет, как с помощью QtCore.QThread вызвать функцию?
Офлайн
Что-то типа такого ;)
class QWorker(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
self.func = None
self.data = None
self.exc = None
self.args = ()
self.kwargs = {}
def work(self, func, *args, **kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
self.start()
def run(self):
# этот метод никогда не вызывается напрямую. вызывается только Qt, в контексте потока
try:
self.data = self.func(*self.args, **self.kwargs)
except Exception, e:
self.exc = e
self.emit(QtCore.SIGNAL("data_error()"))
else:
self.emit(QtCore.SIGNAL("data_ready()"))
Отредактировано (Авг. 23, 2008 09:24:33)
Офлайн
…или так, на свой вкус
class QWorker(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
self.func = None
self.args = ()
self.kwargs = {}
def work(self, func, *args, **kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
self.start()
def run(self):
# этот метод никогда не вызывается напрямую. вызывается только Qt, в контексте потока
data = None
try:
data = self.func(*self.args, **self.kwargs)
except Exception, e:
self.emit(QtCore.SIGNAL("data_error(PyQt_PyObject)"), e)
else:
self.emit(QtCore.SIGNAL("data_ready(PyQt_PyObject)"), data)
Отредактировано (Авг. 23, 2008 09:24:03)
Офлайн
Спасибо!
У меня в отдельной функции присутствует цикл (цикл в котором осуществляются HTTP-запросы, на выходе получается массив из кодов ответов). Я решил взять по примеру выше, вызвать эту функцию из QWorker, но всёравно заметны существенные подзависания. Подскажите пожалуйста, как лучше поступить в таком случае?
Офлайн