Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2008 20:14:09

mario
От:
Зарегистрирован: 2007-08-04
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример с QThreads

Ковыряю потоки 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())

С уважением



Офлайн

#2 Авг. 22, 2008 23:21:08

mario
От:
Зарегистрирован: 2007-08-04
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример с QThreads

Разобрался! Нужен такой заголовок:
import sys
from PyQt4 import QtCore, QtGui

Извините, а никто не подскажет, как с помощью QtCore.QThread вызвать функцию?



Офлайн

#3 Авг. 23, 2008 09:20:33

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Пример с QThreads

Что-то типа такого ;)

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()"))
И это, различай PyQt3 и PyQt4, это разные вещи. импорт “from qt import *” это верный признак PyQt3, в PyQt4 обычно это “from PyQt4 import QtCore, QtGui”.

P.S. bb-тег code рулит, ага



Отредактировано (Авг. 23, 2008 09:24:33)

Офлайн

#4 Авг. 23, 2008 09:23:21

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Пример с QThreads

…или так, на свой вкус

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)

Офлайн

#5 Авг. 25, 2008 14:09:48

mario
От:
Зарегистрирован: 2007-08-04
Сообщения: 43
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример с QThreads

Спасибо!

У меня в отдельной функции присутствует цикл (цикл в котором осуществляются HTTP-запросы, на выходе получается массив из кодов ответов). Я решил взять по примеру выше, вызвать эту функцию из QWorker, но всёравно заметны существенные подзависания. Подскажите пожалуйста, как лучше поступить в таком случае?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version