Асинхронное прослушивание и обработка в приложении PysidePython

Программы на Python
Anonymous
 Асинхронное прослушивание и обработка в приложении Pyside

Сообщение Anonymous »

У меня возникли трудности с интеграцией asyncio с Pyside.
Чего я хочу добиться:
  • У меня есть несколько отправителей (до 30), отправляющих сообщения независимо друг от друга каждые несколько миллисекунд (200 мс) в многоадресной рассылке.
  • У меня есть приложение PySide на Python, которому необходимо прослушивать эти входящие сообщения. сообщения, обрабатывать их и соответствующим образом обновлять график карты (перемещать фигуры, менять цвета маркеров и т. д.).
Поскольку я не могу делиться тем, над чем работаю, в целях конфиденциальности, я разработал прокси-пример, который проще и достаточно близок к моим реальным потребностям, и я могу поделиться здесь.
В этом прокси-примере:
  • У меня есть сценарий-эмиттер, который бесконечно отправляет сообщения на два порта со скоростью, которую можно изменить (здесь время ожидания составляет 1 с). Это имитирует мои датчики, которые излучают сообщения. В этом скрипте сообщения отправляются каждый раз одно за другим. Чтобы быть ближе к реальности, я думаю, нам следует запустить два отдельных сценария на двух разных консолях. Но я думаю, что здесь можно добиться цели. В этом примере сообщения состоят из случайных чисел.
  • На принимающей стороне я хочу создать приложение с PySide, которое получает эти сообщения, обрабатывает их (умножает числа на 100) и отображает их в двух текстовых полях, каждое из которых связано с разными портами.
Изображение

Я рассматриваю здесь использование асинхронного подхода с asyncio, потому что думаю, что моя проблема в основном связана с вводом-выводом. Стадия обработки минимальна. В моем реальном примере это будет означать обновление фигур на карте спутникового просмотра (листовка через Javascript), возможно, перед этим выполнение нескольких вычислений на полученных данных, но не слишком интенсивное использование ЦП.
Я также решил встроить свой график в приложение PySide, чтобы иметь возможность позже добавить больше кнопок и функций.
Пожалуйста, не стесняйтесь указать любое другое решение, которое будет более подходящим (несколько потоков? несколько потоков). процессы?).
В любом случае, я попробовал следующий минимальный пример qt doc, но он не работает.
И теперь я обращаюсь за вашей помощью.
Ниже приведен сценарий эмиттера, а также база кода для приложения PySide без этапов асинхронного прослушивания и обработки (я попросил Le Chat сгенерировать полное приложение Pyside, но оно никогда не работает) поэтому я даю вам только базовый код для заполнения здесь):
EMITTER.py

Код: Выделить всё

import socket
import time
import struct
import random

def send_multicast_messages(port1, port2, multicast_group='224.1.1.1'):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ttl = struct.pack('b', 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)

try:
while True:
# Generate a random value for port1
value1 = random.randint(1, 100)
message1 = f"{value1}"
sock.sendto(message1.encode(), (multicast_group, port1))
print(f"Sent to port {port1}: {message1}")

# Generate a random value for port2
value2 = random.randint(1, 100)
message2 = f"{value2}"
sock.sendto(message2.encode(), (multicast_group, port2))
print(f"Sent to port {port2}: {message2}")

time.sleep(1)

except KeyboardInterrupt:
print("\nExiting the program.")
finally:
sock.close()

if __name__ == "__main__":
port1 = 5000
port2 = 6000
send_multicast_messages(port1, port2)
APP.py

Код: Выделить всё

import sys
from PySide6.QtWidgets import (
QApplication, QMainWindow, QVBoxLayout, QTextEdit, QLabel, QWidget
)

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Port Monitor")
self.setGeometry(100, 100, 400, 300)

# Create widgets
self.label1 = QLabel("Port 5000:")
self.text_edit1 = QTextEdit()
self.text_edit1.setReadOnly(True)

self.label2 = QLabel("Port 6000:")
self.text_edit2 = QTextEdit()
self.text_edit2.setReadOnly(True)

# Layout
layout = QVBoxLayout()
layout.addWidget(self.label1)
layout.addWidget(self.text_edit1)
layout.addWidget(self.label2)
layout.addWidget(self.text_edit2)

# Central widget
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
Заранее большое спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/798 ... pyside-app

Вернуться в «Python»