У меня есть проект от клиента (C ++) до сервера (Python).
Клиент отправил сообщение на сервер, и каждое сообщение содержит три атрибута.
Графический интерфейс должен отображать все атрибуты на экране. Когда клиент отправил первое сообщение, все работает. Но когда он отправил следующее сообщение, мне нужно закрыть окно, и когда я это сделаю, он откроет новое окно и покажет следующее сообщение, если я этого не сделаю, он не покажет новые полученные сообщения.
Я подозреваю, что app.exec_()
мешает программе получать новое сообщение типа в этот случай, но я не уверен. мой вопрос:
Так ли это на самом деле? И если да, то где я должен разместить нить?
Я никогда раньше не использовал
QThread
, и я видел, что мы выполняем Override дляRun()
, а в методRun()
мы вложили всю логику, какую логику я должен вложить в мою конкретную проблему. вы можете найти полный проект здесь
Соответствующий код:
def recive(self):
global income
global table2
msg = Payload(0, 0, 0)
while (True):
print('waiting for a connection..')
conn, addr = self.My_socket.accept()
print("connection has been established | " + repr(addr))
logger.info("connection has been established | " + repr(addr))
while conn:
myThread = MyThread()
buff = conn.recv(sizeof(msg))
print("recv %d bytes" % sizeof(msg))
payload_in = Payload.from_buffer_copy(buff)
print(f"Received id={payload_in.id}, counter={payload_in.counter}, opcode={payload_in.opcode}")
payload_out = payload_in
self.opcode = payload_in.opcode
if self.opcode == 1:
self.export()
elif self.opcode == 2:
payload_out.counter += 1
else:
logger.info("Unexpected opcode %d" % self.opcode)
nsent = conn.send(payload_out)
print("send %d bytes" % nsent)
print("send id=%d, counter=%d, opcode=%d" % (payload_out.id,
payload_out.counter,
payload_out.opcode))
self.setNewTable(payload_in, payload_out)
print("Closing connection to client")
print("----------------------------")
sys.exit()
def setNewTable(self,payload_in, payload_out):
self.insertValues(table1, payload_in)
self.insertValues(table2, payload_out)
ex.show()
app.exec_()
def insertValues(self,table, payload):
table.setItem(0, 1, QTableWidgetItem(str(payload.id)))
table.setItem(1, 1, QTableWidgetItem(str(payload.counter)))
table.setItem(2, 1, QTableWidgetItem(str(payload.opcode)))