0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyQT多线程正确的调用方式

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-08-29 10:24 次阅读

问题背景与描述

我这两天一直想把YOLOv5上加个训练的界面,把控制台的输出重定向到一个PyQT5写的界面上,然后我很顺序的写好了一个简单的测试,发现可以重定向了,一直实时获取输出了。代码如下: 然后我就写了个界面,让控制台显示到界面的texteditor中,我知道训练是一个长耗时的操作过程,所以我单独开启了一个QThread线程来完成,然后在线程中发送获取的控制台输出文本给界面主线程,完成界面刷新。以前我用QT C++就是这样干的,所以这个肯定可以。于是写一个线程类,大致如下:

classTrainTask(QThread):
textWritten=QtCore.pyqtSignal(str)


def__init__(self,command_txt):
QThread.__init__(self)
self.cmd_txt=command_txt


def__del__(self):
self.wait()


defrun(self):
self.textWritten.emit("testrefreshui")
foriinrange(1000):
self.textWritten.emit("testrefreshui")
self.msleep(1)

然后在界面类中通过一个按钮点击开启它, 然后它就会开始发送数据到界面类指定方法outputWritten中。绑定按钮响应事件:

self.start_training_btn.clicked.connect(self.start_traning_action)

点击按钮执行:

my_train = TrainTask(cmd_txt + params)my_train.textWritten.connect(self.outputWritten)my_train.start()
我以为上述代码是天衣无缝,这样就大功告成了,实际上是界面直接卡死了,还有天理吗?多线程居然阻塞返回之后才刷新?!!!

问题现象与解决

把线程中的for训练语句去掉,单独发消息跟界面类,发现可以成功。一旦放开,在run方法中使用for或while之后,就会一直等到结束才返回刷新界面,说明开启的线程没有异步,还是阻塞执行,导致界面卡死

01

尝试一:

网上一通搜索,有人告诉我说必须先定义一个work类,然后把work类移到QThread线程实例中,测试了是个锤子,没用

02

尝试二:

说在线程run方法中导致CPU无法轮询,一定就不是很合理的解释,必须要用线程的sleep方法才行,测试了还是个锤子,没用

03

解决方法:

之前的卡死界面线程的代码没有错的,错就错在调用方法,错误的调用方式

my_train=TrainTask(cmd_txt+params)
my_train.textWritten.connect(self.outputWritten)
my_train.start()

重点来了,正确的调用方式如下:

self.my_train = TrainTask(cmd_txt + params)self.my_train.textWritten.connect(self.outputWritten)self.my_train.finished_signal.connect(self.do_finish_action)self.my_train.finished.connect(self.my_train.deleteLater)self.my_train.start()self.start_training_btn.setEnabled(False)self.stop_training_btn.setEnabled(True)

总结一句话:

一定要把线程变量声明为界面类的成员变量,而不是方法中临时变量,是临时变量必然卡死界面,无法刷新,这个是折腾一天得到的教训!网上搜不到!!! 解决了这个问题之后,我很快写好了一个YOLOv5从界面直接开启训练的演示界面,如下图所示,准备好数据,点几下按钮就可以训练YOLOv5,生成模型了!

00988628-2680-11ed-ba43-dac502259ad0.png

00acdc9a-2680-11ed-ba43-dac502259ad0.png

后来我又添加了一个高级参数设置,发现更好用了!

00c3cdec-2680-11ed-ba43-dac502259ad0.png

从此训练YOLOv5, 只要标注好数据,剩下点点鼠标就好了!

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 界面
    +关注

    关注

    0

    文章

    59

    浏览量

    15614
  • 多线程
    +关注

    关注

    0

    文章

    277

    浏览量

    19919
  • pyqt
    +关注

    关注

    0

    文章

    12

    浏览量

    4297

原文标题:有坑 | PyQT多线程无法刷新,导致界面卡死

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 921次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    Python多线程编程原理

    多线程使用方法Python中使用线程有两种方式,分别是函数或者用类来包装线程对象。用函数来包装线程对象的
    发表于 11-22 14:01

    如何用Mutex解决多线程调用printf()函数对串口访问的冲突?

    互斥量(Mutex)有什么作用?如何用Mutex解决多线程调用printf()函数对串口访问的冲突?
    发表于 07-22 08:07

    OpenHarmony代码编程-多线程

    的arduino程序, 用户可定义多个loop函数, 系统内部会采用多线程方式同时运行这些loop函数, 各个函数之间调用延时函数互不干扰, 独立运行. 各个loop函数通过"虚拟控制器"来进行驱动.
    发表于 12-03 16:36

    设计多线程和多核系统

    如果您的微控制器应用程序需要处理数字音频,请考虑采用多线程方法。使用多线程设计方法可以使设计者以简单的方式重用其部分设计。
    发表于 08-14 15:42 9次下载
    设计<b class='flag-5'>多线程</b>和多核系统

    多线程好还是单线程好?单线程多线程的区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程的区别又
    发表于 12-08 09:33 8.1w次阅读

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及多线程编程相关知识而做出的一些结论。
    发表于 12-08 16:30 1.3w次阅读

    C#多线程技术

    C#和.NET类库为开发多线程应用程序提供了很方便的支持,本章首先简要介绍.NET类库中的Thread类及各种线程支持,再通过示例说明线程使用中需要掌握的规则,最后论述线程同步时出现的
    发表于 04-23 11:32 15次下载

    Linux 多线程可重入函数

    在单线程程序中,整个程序都是顺序执行的,一个函数在同一时刻只能被一个函数调用,但在多线程中,由于并发性,一个函数可能同时被多个函数调用,此时这个函数就成了临界资源,很容易造成
    发表于 05-16 17:41 927次阅读

    Linux下的多线程编程

    ()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序
    发表于 04-02 14:43 595次阅读

    PyQT5+OpenCV多线程协作演示

    学习多线程最典型的问题就是如何在多个线程之间传递消息与写作,PyQT5的线程支持在不同线程之间传递信号触发事件,实现多个
    的头像 发表于 03-08 14:58 1301次阅读

    分析unidbg(unidbgMutil)多线程机制

    由于在工作中遇到了某翻译so中有多线程调用,因此使用unidbg分析(基于unidbgMutilThread)并增加阻塞唤醒机制(futex系统调用),但仍未调用成功
    的头像 发表于 05-20 17:23 2767次阅读
    分析unidbg(unidbgMutil)<b class='flag-5'>多线程</b>机制

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步的问题,即保证多个
    的头像 发表于 11-17 14:22 1151次阅读

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的
    的头像 发表于 03-14 16:55 571次阅读