Асинхронное прослушивание и обработка в приложении 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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