鱼C论坛

 找回密码
 立即注册
查看: 61|回复: 8

qthread子线程终止,挂起

[复制链接]
发表于 2020-11-21 22:37:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
百度了半天,疑问越来越多

1。子进程跑完了,子进程就会销毁吗

2.关了主程序,子进程没有运行完,还会继续运行吗

3.我看最粗暴的方法就是加一个标志,用它控制while循环,这也不是真正意义的停止吧?(还有比如我的子进程:
for i in range(10):
        print(i)
        time.sleep(1)
        print('haha')
        time.sleep(1)
)像这样的我怎么加这个while循环啊 T T

4.exec()不太理解,子进程怎么用这个啊

5.是不是得用到window运行机制来解决这个问题啊 我看有用win32con的 但是我pip不到这个库额  大佬们求助啊!

感激不尽!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-21 23:18:15 | 显示全部楼层
救命啊 大佬们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-22 08:57:06 | 显示全部楼层
i need your help!
thanks!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-11-22 11:09:05 | 显示全部楼层
所以你的代码长啥样,报错是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-22 11:34:31 | 显示全部楼层
suchocolate 发表于 2020-11-22 11:09
所以你的代码长啥样,报错是什么?

我子线程写了一个爬虫 想设计一个按钮 控制暂停 和停止的

就是单纯的不会写啊 不知道怎么让子线程停止
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-22 15:53:37 | 显示全部楼层
"""
QThread 的两种使用方法
1. 不使用事件循环。这是官方的 Manual 、example 以及相关书籍中都介绍的一种的方法。
a. 子类化 QThread

b. 重载 run 函数,run函数内有一个 while 或 for 的死循环

c. 设置一个标记为来控制死循环的退出。

2. 使用事件循环。(博客 you are-doing-it-wrong 批驳的就是这种情况下的 一种用法。)
a. 子类化 QThread,

b. 重载 run 使其调用 QThread::exec()

c. 并为该类定义信号和槽,这样一来,由于槽函数并不会在新开的 thread 运行,很多人为了解决这个问题在构造函数中调用 moveToThread(this)
而争论和不解正是这样的一条语句造成的。
Bradley T. Hughes 给出说明是: QThread 应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject的子类中,然后将该子类的对象moveToThread到新线程中。
"""
其中的QThread::exec() 不太理解  求大佬给讲讲啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-22 21:45:06 | 显示全部楼层
在线等 大佬解答啊 T T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2020-11-23 13:15:39 | 显示全部楼层
help!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2020-11-24 17:22:41 | 显示全部楼层
事件对象
这是线程之间通信的最简单机制之一:一个线程发出事件信号,而其他线程等待该信号。

一个事件对象管理一个内部标志,调用 set() 方法可将其设置为true,调用 clear() 方法可将其设置为false,调用 wait() 方法将进入阻塞直到标志为true。

class threading.Event
实现事件对象的类。事件对象管理一个内部标志,调用 set() 方法可将其设置为true。调用 clear() 方法可将其设置为false。调用 wait() 方法将进入阻塞直到标志为true。这个标志初始时为false。

在 3.3 版更改: 从工厂函数变为类。

is_set()
当且仅当内部旗标为时返回 True。

set()
将内部标志设置为true。所有正在等待这个事件的线程将被唤醒。当标志为true时,调用 wait() 方法的线程不会被被阻塞。

clear()
将内部标志设置为false。之后调用 wait() 方法的线程将会被阻塞,直到调用 set() 方法将内部标志再次设置为true。

wait(timeout=None)
阻塞线程直到内部变量为true。如果调用时内部标志为true,将立即返回。否则将阻塞线程,直到调用 set() 方法将标志设置为true或者发生可选的超时。

当提供了timeout参数且不是 None 时,它应该是一个浮点数,代表操作的超时时间,以秒为单位(可以为小数)。

当且仅当内部旗标在等待调用之前或者等待开始之后被设为真值时此方法将返回 True,也就是说,它将总是返回 True 除非设定了超时且操作发生了超时。

在 3.1 版更改: 很明显,方法总是返回 None。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-12-5 20:17

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表