Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单独的线程中运行asyncio循环,发出来自和到循环的信号_Python_Multithreading_Pyqt_Pyqt5_Python Asyncio - Fatal编程技术网

Python 在单独的线程中运行asyncio循环,发出来自和到循环的信号

Python 在单独的线程中运行asyncio循环,发出来自和到循环的信号,python,multithreading,pyqt,pyqt5,python-asyncio,Python,Multithreading,Pyqt,Pyqt5,Python Asyncio,我正在尝试制作一个UI,它可以在后台与多个可编程设备进行通信。 为此,我实现了一个单独的线程,它运行asyncio.loop。这是必要的,因为我使用bleak 0.9.1连接到设备 使用信号和插槽从UI线程向工作线程获取数据效果良好。然而,它在另一个方向不起作用。据我所知,这是因为线程正在忙于运行循环,并且从未停止过这样做。因此,它无法处理来自UI线程的输入 下面是显示问题的示例代码 在运行asyncio循环时,有没有办法处理线程中的输入插槽 import sys from PyQt5.QtWi

我正在尝试制作一个UI,它可以在后台与多个可编程设备进行通信。 为此,我实现了一个单独的线程,它运行asyncio.loop。这是必要的,因为我使用bleak 0.9.1连接到设备

使用信号和插槽从UI线程向工作线程获取数据效果良好。然而,它在另一个方向不起作用。据我所知,这是因为线程正在忙于运行循环,并且从未停止过这样做。因此,它无法处理来自UI线程的输入

下面是显示问题的示例代码

在运行asyncio循环时,有没有办法处理线程中的输入插槽

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QVBoxLayout
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
import asyncio

class Test_Thread(QObject):
    signal_back = pyqtSignal(int)

    def __init__(self,
                 loop: asyncio.AbstractEventLoop,
                 parent=None):
        super(Test_Thread, self).__init__(parent)
        self.text = "Task1 not configured"
        self.loop = loop
        self.counter = 0

    @pyqtSlot(str)
    def set_text_slot(self, txt):
        self.text = txt

    async def do_stuff1(self):
        while True:
            print(self.text)
            await asyncio.sleep(2.0)

    async def do_stuff2(self):
        while True:
            self.counter += 1
            self.signal_back.emit(self.counter)
            await asyncio.sleep(1.0)

    def work(self):
        #run the event loop
        try:
            asyncio.ensure_future(self.do_stuff1(), loop=self.loop)
            asyncio.ensure_future(self.do_stuff2(), loop=self.loop)
            self.loop.run_forever()
        finally:
            print("Disconnect...")


class Window(QWidget):

    set_text_signal = pyqtSignal(str)

    def __init__(self, parent=None):
        super(Window, self).__init__()
        self.initUi()
        self.startThread()

    def initUi(self):
        layout = QVBoxLayout()
        self.button = QPushButton('User input')
        self.button.clicked.connect(self.sendtotask)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.show()

    def startThread(self):
        loop = asyncio.get_event_loop()
        self.asyciothread = Test_Thread(loop)
        self.thread = QThread()
        self.asyciothread.moveToThread(self.thread)

        self.set_text_signal.connect(self.asyciothread.set_text_slot)
        self.asyciothread.signal_back.connect(self.receivefromthread)
        self.thread.started.connect(self.asyciothread.work)

        self.thread.start()

    @pyqtSlot(int)
    def receivefromthread(self, number):
        print(str(number))

    def sendtotask(self):
        self.set_text_signal.emit("Task: Configured")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = Window()
    ui.show()
    sys.exit(app.exec_())

不必使用线程将asyncio与Qt一起使用,因为有像和这样的库支持它:

导入异步IO
导入系统
从PyQt5.QtWidgets导入QWidget、QPushButton、QApplication、QVBoxLayout
从PyQt5.QtCore导入QObject、pyqtSignal、pyqtSlot
从asyncqt导入QEventLoop
#从qasync导入QEventLoop
班级工作人员(QObject):
信号返回=pyqtSignal(int)
def _uinit _;(self,loop:asyncio.AbstractEventLoop,parent=None):
超级(工作者,自我)。\uuuu初始\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.text=“任务1未配置”
self.loop=循环
self.counter=0
@pyqtSlot(str)
def set_text_插槽(自身,txt):
self.text=txt
异步def do_填充1(自身):
尽管如此:
打印(self.text)
等待异步睡眠(2.0)
异步def do_stuff2(自):
尽管如此:
self.counter+=1
自信号返回发射(自计数器)
等待异步睡眠(1.0)
def工作(自我):
asyncio.sure\u future(self.do\u stuff1(),loop=self.loop)
asyncio.sure\u future(self.do\u stuff2(),loop=self.loop)
类窗口(QWidget):
设置文本信号=pyqtSignal(str)
def uuu init uuu(self,parent=None):
超级(窗口,自我)。\uuuu初始化
self.initUi()
self.start_任务()
def initUi(self):
布局=QVBoxLayout(自身)
self.button=QPushButton(“用户输入”)
self.button.clicked.connect(self.sendtotask)
layout.addWidget(self.button)
def start_任务(自我):
loop=asyncio.get\u event\u loop()
self.worker=worker(循环)
self.set\u text\u signal.connect(self.worker.set\u text\u插槽)
self.worker.signal\u back.connect(self.receive\u from\u worker)
self.worker.work()
@pyqtSlot(int)
def从_工作人员处接收_(自身,编号):
打印(str(编号))
def发送任务(自身):
self.set\u text\u signal.emit(“任务:已配置”)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QApplication(sys.argv)
循环=QEventLoop(应用程序)
asyncio.set\u event\u循环(循环)
ui=窗口()
ui.show()
带循环:
loop.run_forever()