braga 发表于 2020-11-21 22:37:10

qthread子线程终止,挂起

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

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不到这个库额大佬们求助啊!

感激不尽!!!!{:5_92:}

braga 发表于 2020-11-21 23:18:15

救命啊 大佬们{:5_107:}

braga 发表于 2020-11-22 08:57:06

i need your help!
thanks!!!

suchocolate 发表于 2020-11-22 11:09:05

所以你的代码长啥样,报错是什么?

braga 发表于 2020-11-22 11:34:31

suchocolate 发表于 2020-11-22 11:09
所以你的代码长啥样,报错是什么?

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

就是单纯的不会写啊 不知道怎么让子线程停止

braga 发表于 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() 不太理解求大佬给讲讲啊

braga 发表于 2020-11-22 21:45:06

在线等 大佬解答啊 T T

braga 发表于 2020-11-23 13:15:39

help!

Cool_Breeze 发表于 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。
页: [1]
查看完整版本: qthread子线程终止,挂起