Python多线程和(共享变量| | Qt)

Python多线程和(共享变量| | Qt),python,multithreading,qt,pyqt,Python,Multithreading,Qt,Pyqt,我正在重新设计我的软件,因为我做的最后一个软件崩溃了,原因是一个以开始的进程错误地访问了Qt接口 serialThread = threading.Thread(target=serialCycle) serialThread.setDaemon(True) serialThread.start() serialThread主要等待传入的串行数据,对它们进行解码并将它们放在列表中(可能我会移动到numpy数组)。有关连接的信息(串行端口、速度、接收到的数据量)必须写入qt ui。我主要使用全局

我正在重新设计我的软件,因为我做的最后一个软件崩溃了,原因是一个以开始的进程错误地访问了Qt接口

serialThread = threading.Thread(target=serialCycle)
serialThread.setDaemon(True)
serialThread.start()
serialThread主要等待传入的串行数据,对它们进行解码并将它们放在列表中(可能我会移动到numpy数组)。有关连接的信息(串行端口、速度、接收到的数据量)必须写入qt ui。我主要使用全局变量在主线程和串行线程之间交换信息;我可以确保每个变量只由一个线程写入,而从另一个线程读取,以避免出现问题

Qt更新在向主线程发送信息方面有点困难,所以我寻找了另一种解决方案。我找到了这个线程(),但我没有抓住要点。如果我用slot和signal启动一个线程,我就不能因为对同一个变量的多次访问而崩溃吗

  • (问题1)启动线程并行运行,因此它们不应更改qt接口

  • (问题2)不能将整个.ui窗口“链接”到另一个线程,以便该线程可以更新它(显然不是主线程)

  • (问题3)哪种方法最简单,可以通过不同线程更新gui的自我状态(并允许用户更改参数)


谢谢

如果您正在使用Qt(pyqt、pyside等),我建议使用QThread,它比线程更友好,因为此类继承自QObject并处理信号和插槽,然而,线程并没有这样做,因为您必须创建一个继承自QObject的类,这是使用线程的函数。正如您在链接中提到的,从不同的线程更改GUI是一个坏主意。您应该使用信号槽机制将工作线程连接到gui(主)线程。正如@eyllanesc所说,QThread是一种可行的方法。或者,您也可以使用普通python线程,通过连接到signal dispatcher。Python线程将把状态更新放在一个队列中,dispatcher将获取更新并将其作为Qt信号发送。我建议您用一个具体的示例来问一个新问题,说明您正在尝试做什么。有几种方法可以实现线程安全(还有更多的方法是不安全的),要回答您的问题就很难不过于笼统。为什么不使用套接字呢?简单的zmq推/拉/分需要~~ 10行用于客户端,et用于服务器。它们在不同的进程中运行,并且完全线程安全如果您使用的是Qt(pyqt、pyside等),我建议使用QThread,它比线程更友好,因为此类继承自QObject并处理信号和插槽,然而,线程并没有这样做,因为您必须创建一个继承自QObject的类,这是使用线程的函数。正如您在链接中提到的,从不同的线程更改GUI是一个坏主意。您应该使用信号槽机制将工作线程连接到gui(主)线程。正如@eyllanesc所说,QThread是一种可行的方法。或者,您也可以使用普通python线程,通过连接到signal dispatcher。Python线程将把状态更新放在一个队列中,dispatcher将获取更新并将其作为Qt信号发送。我建议您用一个具体的示例来问一个新问题,说明您正在尝试做什么。有几种方法可以实现线程安全(还有更多的方法是不安全的),要回答您的问题就很难不过于笼统。为什么不使用套接字呢?简单的zmq推/拉/分需要~~ 10行用于客户端,et用于服务器。它们在不同的进程中运行,并且是完全线程安全的