搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
酷酷是懒虫
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Java中eq、ne、ge、gt、le、lt的含义_java gt
2
Java后端工程师必备书单(含大后端方向相关书籍)_后端工作岗位上看教材的人_java开发工程师书籍
3
谈谈开源的利弊和国内的开源 ——《新程序员005:开源深度指南 & 新金融背后的科技力量》书评_开源模型的好处与坏处
4
算法:京东广告算法架构体系建设--在线模型系统分布式异构计算演变_京东大模型层次架构从大模型平台和maas的角度画一个大小模型相互(太极阴阳)交互演
5
网络安全常见中间件(mysql,redis,tomcat,nginx,apache,php)安全加固_中间件加固
6
oracle数据库的白名单和黑名单设置_oracle 白名单
7
计算机毕业设计--基于深度学习技术(Transformer、GAN)的图像修复算法(含Github代码+GUI+Web端在线体验界面)_计算机专业本科毕业设计深度学习
8
超越99%动画!我测试了Luma AI视频的首尾帧,流畅度NO.1?_lumaai
9
AI人工智能 浙大 | KnowPAT:针对垂直领域问答的大模型知识偏好对齐与应用
10
「基于动态规划的路径与速度规划——以Apollo的DP算法为参考并附带CPP代码实现」_apollodp搜索
当前位置:
article
> 正文
UI线程与worker线程_worker线程不支持ui操作
作者:酷酷是懒虫 | 2024-07-23 03:55:27
赞
踩
worker线程不支持ui操作
也谈谈我对UI线程和worker线程的理解
UI线程又叫界面线程,能够响应操作系统的特定消息,包括界面消息、鼠标键盘消息、自定义消息等,是在普通的worker线程基础上加上消息循环来实现的,在这个消息循环上不断地获取操作系统或其他线程派发过来的消息(就是个线程里面执行for循环的主),再根据这个消息找到对应的消息处理对象/函数,如果暂时没有消息需要处理就让线程等待,让出CPU时间片,以此表现出该线程一直“在线”的状态,直到某一特定退出消息结束线程。
worker线程又叫工作者线程,为了不影响UI线程的长时间任务处理导致的界面操作阻塞,提升用户体验,开以考虑开辟一个worker线程来完成复杂的任务,任务处理完后可以让它立即退出也可以让它继续等待新的任务,看具体需要。一个处理完任务后不退出而处于等待状态的worker线程其实跟UI线程已经没多大区别了,在worker线程也可以自己实现一个任务队列,然后不断地获取任务来达到UI线程的效果。
不管在什么操作系统,UI线程与worker线程协同工作不可避免地都会面对线程同步执行的问题,这里同步执行不是“对象状态同步”的概念,而是将线程执行“串行化”,比如线程A要执行后续的代码段之前先要等待线程B完成某一特定任务,当然,也可以通过“对象状态同步”的方式来达到这个效果,只是会比较麻烦一点。
以windows系统为例,当worker线程处理完结果后,需要把结果返回给UI线程,好让界面能够更新显示最新的状态,有这么几种方式:
1.直接在worker线程执行处调用API::SendMessage,把消息和附带参数发往UI线程的消息队列,让UI线程从挂起状态恢复成执行态后从消息泵获取处理,如果当前消息泵没有其他消息,则立即处理此消息,否则需等待其他消息处理完后轮到它才执行,而此时worker线程处于等待消息处理的状态,UI线程处理完消息后,它才继续往下执行;
2.直接在worker线程执行处调用API::PostMessage,与SendMessage一样,只不过,这是worker线程不等待处理结果,继续往下走,又叫异步方式。如果PostMessage有附带参数,这时就得谨慎处理了,就像普通的线程异步处理一样,对象必须加锁解锁,除非这个附带参数是临时从堆上分配的对象,由UI线程处理完消息前负责释放,但是这又涉及到模块之间的内存申请、释放问题,搞不好,程序直接core dump。
3.worker线程直接把结果存放于UI线程能访问的某一处,等到UI线程执行到需要用到该结果时才访问,也要对这个对象进行加锁解锁,搞不好容易死锁。
以上3中方法,不管是哪种,处理起来都很麻烦,尽管第一种方式相对比较简单,可是写起代码来还是觉得繁琐,要先定义一个双方认识的消息(还得考虑该消息会不会冲突,是否考虑使用RegisterWindowMessage),定义好消息处理函数,然后添加消息映射宏,而且代码看起来不如顺序执行那么流畅,维护代码时要在这些地方跳来跳去,且还不论有多种同步消息需要同步,时间久了,只会越来越难维护。
接触这种线程“伪同步”一段时间后,自然而然对这种方式反感,开始思考一个问题:为什么操作系统不提供一个线程切换的API供调用,这样多省事啊。等待认真了解线程工作原理后,才发现这想法太天真了。
通常一个线程得以被操作系统调度运行,是因为符合当前优先级配置,且该线程尚有代码需要执行(这样说貌似也不太合理,想不出来),最直观的就是函数调用(不管全局函数也好、构造函数也好。。。),既然是函数调用那肯定有参数、变量入栈出栈,每个线程被挂起后,为了恢复执行后能够之前的状态下继续执行,就必然是一个线程对应一个线程栈,以此线程间互不干扰,各自在自己的一亩三分地上干活。这时再考虑线程“串行化”的问题,如果系统要提供线程切换的API,那么worker线程需要与UI线程同步时就必须让UI线程切换到worker线程拥有的线程栈上来,否则如何访问worker线程中的那些变量、参数,UI线程切换过来后,之前保留的现场又该怎么处理,如果栈是可拷贝的,那UI线程把它拷贝过来后置于栈顶,那栈可用空间不够大怎么办。此外还有种种我这水平未能触及的原因,发现真要这么做的话,这代价实在太高了,还不能保证如预期那样进行。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/868130
推荐阅读
article
第二章:AI大
模型
的
基础知识
2.1
机器
学习
基础_ai大
模型
基础知识
...
1.背景介绍1. 背景介绍
机器
学习
(Machine Learning)是一种计算机科学
的
分支,它使计算机能够从数据中
学习
...
赞
踩
article
海外
ASO
对出海
的
iOS
APP
的
重要性
...
所以造就了一大批个人/企业开启了海外之路,寻求突破
的
同时寻求生存,推广永远是非常重要
的
一环,在刚出海
的
情况下,我们最熟悉...
赞
踩
article
GitHub
Pull
Request
流程详解_
github
compare and
pull
re...
Pull
Request
是一种让开发者提交代码更改的方式,它不仅能让团队成员审查代码,还能确保代码质量和一致性。在PR中...
赞
踩
article
5个高效使用
github
的
chrome
插件
...
October下载地址:https://
chrome
.google.com/webstore/detail/octotr...
赞
踩
article
【
故障诊断
分析
】基于
matlab
小
波包
能量
分析
轴承
故障诊断
【含
Matlab
源码 1620期】_基于小...
小
波包
能量
分析
轴承
故障诊断
完整的代码,方可运行;可提供运行操作视频!适合小白!_基于小
波包
能量
分析
轴承
故障诊断
基于小
波包
...
赞
踩
article
数据结构
之
栈
的
应用_
栈
在
计算机科学
领域有着广泛
的
应用。比如
在
编译和运行
计算机程序
的
过程
中,就需要...
4、
栈
的
应用
栈
在
计算机科学
领域具有广泛地应用。如,
在
编译和运行计算机语言程序
的
过程
中,就需要利用
栈
进行语法检查(如{和}...
赞
踩
article
ECMWF
气象
数据
相关介绍...
ECMWF
的再分析
数据
集及相关介绍 :https://www.ecmwf.int/en/forecasts/datase...
赞
踩
article
FOR
UDMA
是在
windows
方式下对
硬盘
进行诊断和修复的工具_
pc3000
for
udma
...
PC3000 FOR
UDMA
是在
windows
方式下对
硬盘
进行诊断和修复的工具PC3000 FOR
UDMA
是在win...
赞
踩
article
知道
创宇
研发
技能
表
3.1_
知道
创宇
技能
表
学习顺序...
Expand - Collapse
知道
创宇
研发
技能
表
v3.12016/5/18 发布by @
知道
创宇
(www.known...
赞
踩
article
2024
年最全「刷起来」
Go
必看的进阶
面试题
详解
_
golang
进阶
面试题
,
Go
lang
面试题
高级
_
...
【代码】
2024
年最全「刷起来」
Go
必看的进阶
面试题
详解
_
golang
进阶
面试题
,
Go
lang
面试题
高级。
_
golan...
赞
踩
article
打造高效机器
学习
工作流!
Amazon
Q
Developer
已集成到
Amazon
SageMak...
本文作者 Esra Kayabali在上个星期的亚马逊云科技纽约峰会中,亚马逊云科技宣布
Amazon
Q Develo...
赞
踩
article
idea can‘
t
upda
t
e no
t
racked
branch
choose
ups
t
rea...
gi
t
gi
t
branch
--se
t
-
ups
t
ream
-
t
o=idea can'
t
upda
t
e no
t
racke...
赞
踩
article
python
怎样
调用
opencv
库
_
python
库
(
OpenCV
的简单使用)...
因为需要系统的使用一下
python
中的
OpenCV
库
,所以这里也给大家一个使用过程吧。新手可以对着打一遍,对自己会有好处...
赞
踩
article
图解
爬虫
,
用几个最
简单
的
例
子带你入门
Python
爬虫
_
爬虫
实
例
100
例
图解...
一、前言
爬虫
一直是
Python
的一大应用场景
,
差不多每门语言都可以写
爬虫
,
但是程序员们却独爱
Python
。之所以偏爱Py...
赞
踩
article
硬盘
坏
了?真
坏
了?我帮你呀!_
easeus
partition
master
可以
修复
坏
道吗...
因为众所周知的原因:
硬盘
总是
坏
!但是嘛,其实
硬盘
数据恢复也是那么难,一起来看看!_
easeus
partition
ma...
赞
踩
article
大
语言
模型
框架
-
Megatron
-
LM
源码分析_
megatron
-lm架构...
且可以使用低精度16bit的内核。张量并行分为行切和列切并行(指的是对输入矩阵切法),具体读者可以参考
Megatron
论...
赞
踩
article
四、
初识
C语言
(
4
)...
4
。四、
初识
C语言
(
4
) 1.作业:static修饰局部变量 #define _CRT_...
赞
踩
article
【
BMS
软开系列】1、
ISO
26262
功能
安全
标准 (一)_
iso
26262
...
BMS
(Battery Management System),也叫电池管理系统。按照新能源汽车对电池管理的需求,
BMS
具...
赞
踩
article
大
数据
技术
原理-----期末复习-
基础知识
_
大
数据
思维
方式
包括:全样
而
非
抽样
;
效率
而
非
精确
;
相关
而
非
...
一、
大
数据
技术
1、试述
数据
产生
方式
经历的几个阶段。运营式系统阶段:在这个阶段,
数据
的产生
方式
是被动的,只有当实际企业业务...
赞
踩
article
selenium
-
4
键盘事件...
例:from
selenium
import webdriverb = webdriver.Firefox()b.get...
赞
踩
相关标签
大数据
人工智能
语言模型
AI
LLM
Java
Python
架构设计
Agent
RPA
ASO优化
github
java
html
python
数据可视化
css
matlab
ECMWF
气象数据集
气象再分析数据
windows
数据库
数据结构