Russian Qt Forum
Ноябрь 22, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qthread, Qsocket, сигналы-слоты.., Pyqt, Qt.4.8 , win7  (Прочитано 3829 раз)
andrewshkovskii
Гость
« : Январь 18, 2012, 19:45 »

Проблема : есть гуи-софтина, в которой есть длительная операция и работа сокетами (tcp).
При длительной операции гуи-поток подвисает, подвисают и сокеты и сервер сбрасывает подключение по этим сокетами( кот.подписли)
Описание объектов :
 Менеджер сокетов -  содержит в себе список всех сокетов и обрабатывает данные, поступившие от них, а так же всяческие исключительные ситуации, живет в основном потоке
ГУИ - гуёвина где и происходит длительная операция, кот. подвешивает основной поток.
Объект-поток UpQSocketThread - поток с сокетом.
Цель :
Заставить сокет работать в потоке, отличным от гуи, да так, что бы все те слоты объекта-потока, соединенные с содержащимся в нем(объекте-потоке) сокете выполнялись в отдельном потоке.
А слоты, соединенные с сигналами объекта-потока выполнялись в основном потоке.
Вопрос :
Где (в run() или конструкторе объекта-потока) создавать сокет для объекта-потока и соединять сигналы сокета со слотами объекта-потока и каким типом соединения.
И каким типом соединения соединять сигналы объекта-потока с слотами менеджера сокетов.

Вот код, для наглядности. При данном коде происходит следующее :
Часто получаю сообщения типа :
Цитировать
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().)
Или же
Цитировать
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().)
Или вовсе софтина крашиться.
Что я не понял?как правильно сделать?
Код
Python
class UpQSocket(QTcpSocket):
def __init__(self):
QTcpSocket.__init__(self)
self.wait_len = ''
self.temp = ''
self.setSocketOption(QTcpSocket.KeepAliveOption, QVariant(1))
 
def connectToHost(self, host, port):
self.temp = ''
self.wait_len = ''
QTcpSocket.connectToHost(self, host, port)
 
 
class UpQSocketThread(QThread):
data_ready = pyqtSignal(unicode)
 
error = pyqtSignal(int)
connected = pyqtSignal()
disconnected = pyqtSignal()
 
def __init__(self, host , port):
QThread.__init__(self)
self.start()
self.host = host
self.port = port
 
def state(self):
return self.socket.state()
 
def resend_error(self, error_code):
self.error.emit(error_code)
 
def resend_connected(self):
self.connected.emit()
 
def resend_disconnected(self):
self.disconnected.emit()
 
def run(self):
self.socket = UpQSocket()
self.socket.readyRead.connect(self.on_ready_read)#, Qt.DirectConnection)
self.socket.error.connect(self.resend_error)#, Qt.DirectConnection)
self.socket.disconnected.connect(self.resend_disconnected)#, Qt.DirectConnection)
self.socket.connected.connect(self.connected)#, Qt.DirectConnection)
self.socket.connectToHost(self.host, self.port )
self.exec_()
 
def send(self, data):
self.socket.writeData('%s|%s' % (len(data), data))
 
def close(self):
self.socket.close()
self.terminate()
 
def on_ready_read(self):
if self.socket.bytesAvailable():
data = str(self.socket.readAll())
while data:
#process data...

Сигналы объекта-потока подключаются аналогично(AutoConnection), после создания объекта-потока.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 20.