小马快跑777 发表于 2024-4-11 09:20:41

多线程工作时函数进入while true循环后无法设置文本该如何解决?


datafetch函数作为一个线程,持续获取参数,并将参数打印出来并设置为ui中的相应文本
但是当makesure进入while True循环时,虽然datafetch仍然持续进行,并打印参数,但是无法调用setText函数修改ui中相应文本的文本值,有没有比较懂这个逻辑原理的,帮忙解释一下,谢谢

爱晴海玩偶 发表于 2024-4-11 10:20:44

别的线程不是只要提供数据给界面的线程吗?你这不是卡住主界面刷新吗

zyqcome 发表于 2024-4-11 10:47:16

一般情况下,刷新 UI,都不会是在数据处理线程中,一个是有权限,一个是UI 刷新本身慢,刷新太快你看不过来也没有意义

正常的逻辑是数据处理是数据处理的逻辑,死循环里一直刷 UI,在哪种编程语言里,情况都差不多

Appcat 发表于 2024-4-11 12:06:54

古二真!

你的线程在while true死循环,UI线程根本得不到执行权去刷新界面,界面怎么可能变化呢?
至于print输出,那是python的标准输出,和UI无关,因为UI不是python自己的

提个建议,提问题最好把前因后果,上下文都说一下,使用的设备,机器,软件工具环境什么的,
也方便回答问题的人快速锁定问题核心

小马快跑777 发表于 2024-4-11 14:50:47

Appcat 发表于 2024-4-11 12:06
古二真!

你的线程在while true死循环,UI线程根本得不到执行权去刷新界面,界面怎么可能变化呢?
(引用自4楼)

我写的while True是有跳出循环的条件的,大概就是在到达一个位置后跳出循环,在循环实时获取电机位置和速度并修改ui界面的文本值。我理解你的意思,在循环中ui得不到执行权,没办法更新,那该怎么修改比较好呢?

Appcat 发表于 2024-4-11 16:11:43

小马快跑777 发表于 2024-4-11 14:50
我写的while True是有跳出循环的条件的,大概就是在到达一个位置后跳出循环,在循环实时获取电机位置和速 ...
(引用自5楼)

pyQT我不熟,而且因为商业授权的问题,公司也不允许使用,这里就不能给你直接指导了,万一弄错耽误了你

你这个问题是典型的任务调度,底下需要实时从接口或者设备拿数据,然后需要UI及时更新,UI的更新速度,接口数据
的速度,就是一对矛盾;

实时数据非常快,使用while true读取这样最及时,但是UI更新就不能及时了,所以要权衡一下,
如果数据速度没有那么快,是不是可以用一个定时任务去读数据(不要用线程),然后回到主线程UI自然就更新。

但是如果数据速度非常高,即使实现了UI的及时更新,也没有实际意义,因为人眼始终是慢的,界面会根本看不清。

那么还有一种思路,就像python的signal模块,有点模仿硬件中断的思路,让数据到来时触发一个信号,然后预定义
的信号处理函数完成对数据的处理,全部工作都在主进程中完成,也无需专门的线程参与

小马快跑777 发表于 2024-4-11 23:01:01

Appcat 发表于 2024-4-11 16:11
pyQT我不熟,而且因为商业授权的问题,公司也不允许使用,这里就不能给你直接指导了,万一弄错耽误了你

...
(引用自6楼)

okok,谢谢了,确实不需要这么快的更新速度
页: [1]
查看完整版本: 多线程工作时函数进入while true循环后无法设置文本该如何解决?