PyQt5学习笔记13----pyqt线程间通信

信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托、事件,比如Repeater控件类,当行数据绑定后,触发一个ItemDataBound事件,不管使用者使用会监听该事件并做额外处理,其控件类内部都会触发该事件,这种机制很多程度提高了类的封装性和完整性。

  PyQt的窗体控件类已经有很多的内置信号,开发者也可以添加自己的自定义信号,信号槽有如下特点:

    - 一个信号可以连接到许多插槽。

    - 一个信号也可以连接到另一个信号。

    - 信号参数可以是任何Python类型。

    - 一个插槽可以连接到许多信号。

    - 连接可能会直接(即同步)或排队(即异步)。

    - 连接可能会跨线程。

    - 信号可能会断开

  (以上几条特点翻译于官方文档),接下来,我将以若干个实例,来体现以上几个特点。

内置信号槽的使用

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

def sinTest():
    btn.setText("按钮文本改变")

app = QApplication([])

main = QWidget()
main.resize(200,100)
btn = QPushButton("按钮文本",main)
##按钮btn的内置信号连接名为sinTest的槽
btn.clicked.connect(sinTest)
main.show()

app.exec_()

自定义信号槽的使用

class SinClass(QObject):

    ##声明一个无参数的信号
    sin1 = pyqtSignal()

    ##声明带一个int类型参数的信号
    sin2 = pyqtSignal(int)

    ##声明带一个int和str类型参数的信号
    sin3 = pyqtSignal(int,str)

    ##声明带一个列表类型参数的信号
    sin4 = pyqtSignal(list)

    ##声明带一个字典类型参数的信号
    sin5 = pyqtSignal(dict)

    ##声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
    sin6 = pyqtSignal([int,str], [str])

    def __init__(self,parent=None):
        super(SinClass,self).__init__(parent)

        ##信号连接到指定槽
        self.sin1.connect(self.sin1Call)
        self.sin2.connect(self.sin2Call)
        self.sin3.connect(self.sin3Call)
        self.sin4.connect(self.sin4Call)
        self.sin5.connect(self.sin5Call)
        self.sin6[int,str].connect(self.sin6Call)
        self.sin6[str].connect(self.sin6OverLoad)

        ##信号发射
        self.sin1.emit()
        self.sin2.emit(1)
        self.sin3.emit(1,"text")
        self.sin4.emit([1,2,3,4])
        self.sin5.emit({"name":"codeio","age":"25"})
        self.sin6[int,str].emit(1,"text")
        self.sin6[str].emit("text")

    def sin1Call(self):
        print("sin1 emit")

    def sin2Call(self,val):
        print("sin2 emit,value:",val)

    def sin3Call(self,val,text):
        print("sin3 emit,value:",val,text)

    def sin4Call(self,val):
        print("sin4 emit,value:",val)

    def sin5Call(self,val):
        print("sin5 emit,value:",val)

    def sin6Call(self,val,text):
        print("sin6 emit,value:",val,text)

    def sin6OverLoad(self,val):
        print("sin6 overload emit,value:",val)

sin = SinClass()

运行结果:

sin1 emit

sin2 emit,value: 1

sin3 emit,value: 1 text

sin4 emit,value: [1, 2, 3, 4]

sin5 emit,value: {‘age‘: ‘25‘, ‘name‘: ‘codeio‘}

sin6 emit,value: 1 text

sin6 overload emit,value: text

信号槽N对N连接、断开连接

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class SinClass(QObject):

    ##声明一个无参数的信号
    sin1 = pyqtSignal()

    ##声明带一个int类型参数的信号
    sin2 = pyqtSignal(int)

    def __init__(self,parent=None):
        super(SinClass,self).__init__(parent)

        ##信号sin1连接到sin1Call和sin2Call这两个槽
        self.sin1.connect(self.sin1Call)
        self.sin1.connect(self.sin2Call)

        ##信号sin2连接到信号sin1
        self.sin2.connect(self.sin1)

        ##信号发射
        self.sin1.emit()
        self.sin2.emit(1)

        ##断开sin1、sin2信号与各槽的连接
        self.sin1.disconnect(self.sin1Call)
        self.sin1.disconnect(self.sin2Call)
        self.sin2.disconnect(self.sin1)

        ##信号sin1和sin2连接同一个槽sin1Call
        self.sin1.connect(self.sin1Call)
        self.sin2.connect(self.sin1Call)

        ##信号再次发射
        self.sin1.emit()
        self.sin2.emit(1)

    def sin1Call(self):
        print("sin1 emit")

    def sin2Call(self):
        print("sin2 emit")

sin = SinClass()

运行结果:

sin1 emit

sin2 emit

sin1 emit

sin2 emit

sin1 emit

sin1 emit

多线程信号槽通信

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Main(QWidget):
    def __init__(self, parent = None):
        super(Main,self).__init__(parent)

        ##创建一个线程实例并设置名称、变量、信号槽
        self.thread = MyThread()
        self.thread.setIdentity("thread1")
        self.thread.sinOut.connect(self.outText)
        self.thread.setVal(6)

    def outText(self,text):
        print(text)

class MyThread(QThread):

    sinOut = pyqtSignal(str)

    def __init__(self,parent=None):
        super(MyThread,self).__init__(parent)

        self.identity = None

    def setIdentity(self,text):
        self.identity = text

    def setVal(self,val):
        self.times = int(val)

        ##执行线程的run方法
        self.start()

    def run(self):
        while self.times > 0 and self.identity:
            ##发射信号
            self.sinOut.emit(self.identity+" "+str(self.times))
            self.times -= 1

app = QApplication([])

main = Main()
main.show()

app.exec_()

运行结果:

thread1 6

thread1 5

thread1 4

thread1 3

thread1 2

thread1 1

时间: 2024-11-10 15:55:24

PyQt5学习笔记13----pyqt线程间通信的相关文章

PYQT 线程间通信

信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托.事件,比如Repeater控件类,当行数据绑定后,触发一个ItemDataBound事件,不管使用者使用会监听该事件并做额外处理,其控件类内部都会触发该事件,这种机制很多程度提高了类的封装性和完整性. PyQt的窗体控件类已经有很多的内置信号,开发者也可以添加自己的自定义信号,信号槽有如下特点: - 一个信号可以连接到许多插槽.

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

1.毕老师第十四天内容,线程间的通信.大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的. 涉及到的方法: wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒.只能在同步方法中被调用. notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态.只能在同步方法和同步代码块中被调用. notifyAll():接触所有在该对象上调用wait()方法的

多线程学习笔记四--------------线程间通信问题

线程间通信问题: 多个线程在处理同一资源,但是任务却不同: java中将资源共享的方法(思路): 1.方法或者变量静态化---->静态化后,在类加载的时候,会将其加载到内存的方法区进行共享 2.单例设计模式---->保证只对一个实例进行操作. 3.将资源作为操作该资源的类的构造函数的参数,这样可以保证此类的多个对象在使用该资源的时候使用该资源的同一个实例. 现在我们要用第三种方法来进行线程间的通信. 情景:两个线程 ,一个负责输入,一个负责输出:共同处理一个资源. public class T

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

线程间通信与同步

线程间通信的两个基本问题是互斥和同步. 同步:一个线程的执行依赖于另一个线程的消息. 互斥:对共享资源的排他性,一个线程必须等待别的线程释放公共资源之后才能继续执行. 同步机制(Win32中):事件,信号量,互斥量,临界区 各种同步方式: #全局变量 win32多线程通信的最方式,但用全局变量同步会有两个弊端,应该避免 >主线程没有进入休眠状态,依然会消耗CPU资源 >如果主线程优先级比ThreadFunc高,则全局变量无法在ThreadFunc中被改变,这样线程无法得到通知 #事件 由于ev

黑马程序员——JAVA基础之Day24 多线程 ,死锁,线程间通信 ,线程组,线程池,定时器。

------- android培训.java培训.期待与您交流! ---------- Lock()实现提供了比使用synchronized方法和语句可获得更广泛的锁定操作. private Lock lock =new ReentrantLock(); 被锁的代码要用   lock.lock()                lock.unlock()    包括.其中用try   ...finally包围 同步:效率低,如果出现同步嵌套,会出现死锁.  但是安全. 死锁问题:两个或者两个以上

Android中线程间通信原理分析:Looper,MessageQueue,Handler

自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么做? 以上者两个问题,是我最近总结出来的,在我们学习了解一个新的技术之前,最好是先能回答这两个问题,这样你才能对你正在学习的东西有更深刻的认识. 第一个问题:google的程序员们搞出这一套东西是为了解决什么问题的?这个问题很显而易见,为了解决线程间通信的问题.我们都知道,Android的UI/Vi

Java线程间通信之wait/notify

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.先来我们来看下相关定义: wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁. wait(long):超时等待最多long毫秒,如果没有通知就超时返回. notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前

iOS中多线程_05_线程间通信NSThread/GCD

1.什么叫做线程间通信 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 2.线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 3.线程间通信示例 UIImageView下载图片这个例子, 主线程中开启一个子线程去下载图片, 当图片下载完成之后再回到主线程中更新显示图片, 这样的一个过程就是线程间通信的一个过程. 4.NSThread线程间通信常用方法 // 第一种- (void)performSelectorOnMain