Python+PyQt架构:多线程入门示例

在大型软件开发过程中,多线程是一种经常使用的编程技术。使用多线程技术,可以将耗时较大的代码放到单独的线程中处理,避免软件界面程序的假死现象,提高软件的运行效率。

下面儿给出一个在Python语言中使用PyQt界面库编写多线程程序的入门例子。

例子说明

该例运行界面中包含三个按钮控件和一个文本框控件,如下图所示:

点击“创建新线程”按钮,可以创建一个子线程,在该线程中每隔500ms产生一个自加1的数,将该数值显示在文本框中,同时,文本框中也显示了当前线程的序号及ID号,可多次点击该按钮来创建多个子线程。上图文本框中显示的是创建了四个子线程的情况。

点击“停止所有线程”可以停止所有已经创建的子线程。

点击“退出程序”按钮则退出当前程序。

线程类的代码实现

在PyQt中创建一个基于QThread类的线程类——MyThread,具体实现代码如下图所示:

对上述代码说明如下:

第15行,定义一个信号dispSignal,其传递的参数类型为str字符串类型。

第16-19行,类的初始化函数,主要定义两个成员变量number和keepRunning,分别表示当前线程的序号和当前线程是否运行的标志。其中,number在线程类的实例定义时由主线程(调用者)传入,keepRunning初始化为True。

第21-22行,定义一个stop函数由主线程调用,在函数内部设置keepRunning的值为假,用以停止该线程的运行。

第24-31行,重写run函数,这是PyQt线程中的主要代码实现部分,当在主线程中调用线程类的start函数时会自动运行该函数。在该函数中,首先获得该线程的id,然后在while循环中每隔500ms产生一个自加1的变量i(初始值为0),然后将线程的序号、id号和i的值组合成一个字符串信息通过信号dispSignal发送出去。当keepRunning的值为假时退出while循环。

因此,可在主线程中定义一个槽函数对应信号dispSigna用以处理信息的显示。

软件界面类的代码实现

定义一个基于QWidget类的窗口类——MyWnd类,作为软件运行的主界面窗口类。具体实现代码如下图所示:

对上述代码说明如下:

第34-55行,类的初始化函数,定义界面的布局。其中,第53行,定义了一个列表变量allThreads,存储所创建的线程。

第57-61行,点击“创建新线程”按钮时对应的槽函数,在该函数中定义一个新的线程实例thread,然后将线程的dispSignal信号关联到slotDisplay函数并启动该线程,最后将thread添加到列表allThreads中。

第63-67行,点击“停止所有线程”按钮时对应的槽函数,在该函数中对列表allThreads中所有的线程调用stop函数停止线程的运行并删除整个列表。

第69-70行,对应线程中dispSignal信号的槽函数,在该函数中将线程中传递过来的参数(线程的序号、id号和i的值)在文本框中逐行进行显示。

应用程序测试代码实现

上面已经定义了线程类和主界面窗口类,在主程序中调用这两个类就可以完成前面例子的运行界面程序。具体实现代码如下图所示:

备注

这是一个比较简单的多线程编程入门示例,仅仅介绍了怎样在Python语言中使用PyQ界面库创建、运行及停止一个线程,而对于其它诸如线程间同步等技术本例均未涉及。

如果你觉得这篇文章对你有用的话,抖抖小手点个赞吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181215A004PQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券