搜索
查看
编辑修改
首页
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
基于FPGA的SPI时序图设计VHDL代码VIVADO仿真_vivado仿真文件编写vhdl
2
深度学习在NLP领域的发展之Transformer_transformer的发展 csdn
3
推荐10个AI人工智能技术网站_ai trends
4
【Python】中国地震网数据抓取_使用python语言进行一次完整的《中国地震台网数据分析》,通过网络抓取中国地震台
5
KubeSphere - 多租户管理
6
深入分析 Android ContentProvider (六)
7
【时序约束】读懂用好Timing_report_timing propogation
8
谷歌chrome浏览器的源码分析(一)_chrome浏览器源码分析
9
Stable Diffusion整合包 安装教程!轻松解压,即刻体验!
10
全网最详细Gradio教程系列5——Gradio Client: python
当前位置:
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
Stable
Diffusion
和
MJ对比分析_
webui
stable
diffusion
和
mj...
特征Midjourney开源是否免费是否图像逼真度非常逼真,但有时会产生奇怪或不连贯的细节更具艺术性
和
风格化,但有时可能...
赞
踩
article
Python
数据
爬
取
超详细讲解(零
基础
入门
,
老年人都看的懂)_
python
爬
取
数据
...
我们平时都说
Python
爬
虫
,
其实这里可能有个误解
,
爬
虫并不是
Python
独有的
,
可以做
爬
虫的语言有很多例如:PHP,J...
赞
踩
article
Jenkins
源码管理配置提示‘
returned
status
code
128:
stdout
:st...
今天在用jenkins部署的时候出现了以下的错误提示,找不到项目,便猜想是否是该git账户无项目权限的问题,随后便在Cr...
赞
踩
article
两个同级
路由
如何相互
访问
_同级
路由
器
互访
...
飞鱼星
路由
器
设置:WAN(192.168.1.2) LAN(192.168.0.1)1、添加静态
路由
2、开启远程管理(想...
赞
踩
article
FastAPI
定义
全局变量
并实现通过接口改变
全局变量
_
fastapi
全局变量
...
FastAPI
定义
全局变量
并实现通过接口改变
全局变量
_
fastapi
全局变量
fastapi
全局变量
...
赞
踩
article
人脸
检测
(Python)_
python
facedetector
...
FaceDetector是一个基于OpenCV的库,它提供了一个简单而强大的
人脸
检测
器。它使用了OpenCV的级联分类器...
赞
踩
article
【
python
学习
1】
pycharm
安装
与
使用
_
pycharm
新建
工程
有
von
...
python
学习
第一步,
pycharm
使用
_
pycharm
新建
工程
有
von
pycharm
新建
工程
有
von
...
赞
踩
article
微软
: 用于文本到
语音
合成(
TTS
)的
语言
模型
方法
VALL
-E_
微软
tts
模型
...
从产业化的角度,
VALL
-E 在定制
语音
、有声内容创作等领域有广阔的应用前景。但是,如何平衡
模型
性能和部署成本,如何适配...
赞
踩
article
数据结构
算法与解析
(
STL
版含源码
)
_
数据结构
是不是
stl
源码...
第1章 线性表线性表:抽象的数据类型。逻辑结构:除第一个元素外,每个元素都有一个前驱;除最后一个元素外,每个元素都有一个...
赞
踩
article
Kettle
和其它几种
ETL
工具
(
包括
Informatica
)
的
比较...
本文比较了开源
工具
Kettle
与商业软件
Informatica
,以及其他
ETL
工具
如Talend和Inaplex Ina...
赞
踩
article
github
通过
revert
还原已经
merge
的
代码
_
github
revert
...
文章目录1 问题2 痛苦过程3 解决操作4 注意事项1 问题dev分支上出现过去删除的
代码
初步定位后,是一位同事merg...
赞
踩
article
《
牧羊
少年
奇幻
之旅》之
水晶
店老板
_
牧羊
少年
奇幻
之旅
水晶
店老板
...
牧羊
少年
从撒冷王那得知了天命这个词,并最终决定追随自己的天命。他从西班牙最南端的台里发(Tarifa)渡海,去了...
赞
踩
article
Jenkins
- 札记 - 无法连接仓库:
Command
“
git
ls-
remote
-h --...
VMware - 目录
Jenkins
- 札记 - 无法连接仓库:
Command
"
git
ls-
remote
-h -...
赞
踩
article
什么是
功能
安全
_
功能
安全
定义
...
功能
安全
作为整体
安全
的一部分,是以系统
功能
的可靠执行(即依赖于一个系统或设备对其输入的正确响应)来确保系统
安全
。以电机的...
赞
踩
article
MySQL
在
Centos
7
环境
安装
_
centos
7
适合哪些版本
mysql
...
详细讲解MySql在云服务器上
安装
!_
centos
7
适合哪些版本
mysql
centos
7
适合哪些版本
mysql
...
赞
踩
article
因为
无法
验证
开发者
_“
Mac
应用
”
已损坏,
打不开
或
无法
打开“×××
”
,
因为
无法
确认
开发者
的身份......
在
Mac
下安装一些软件时提示
”
来自身份不明
开发者
”
,其实这是
Mac
新系统启用了新的安全机制。默认只信任
Mac
Ap...
赞
踩
article
SQL
server
2008
r2
下载安装
配置、使用、新建登录用户及通过
Navicat
远程连接_sq...
SQL Server
2008
R2 是 Microsoft 推出的一款关系型数据库管理系统。它是 SQL Server...
赞
踩
article
mac
os
x逆向工程_
mac
os
逆向...
Please do not make a bruteforce mirror of this page! If you ...
赞
踩
article
【
故障诊断
】基于
matlab
改进型
的节点重构小
波包
频带
能量
谱结合概率
神经网络
PNN
故障诊断
(含数据)...
改进型
的节点重构小
波包
频带
能量
谱结合概率
神经网络
PNN
故障诊断
完整的代码,方可运行;可提供运行操作视频!适合小白!_
频带
...
赞
踩
article
linux
系统管理
与
服务器
配置
高志君_
Linux
教程-只需几分钟安全
配置
Linux
服务器
...
服务器
安全并不难实现,本文介绍一种简单的
Linux
服务器
安全
配置
,只要您花几分钟就可以在全新
服务器
上阻止常见攻击。账号管...
赞
踩
相关标签
stable diffusion
人工智能
python
开发语言
Python入门
编程学习
零基础
jenkins
运维
路由器
网络
fastapi
opencv
计算机视觉
pycharm
学习
microsoft
语言模型
语音识别
java
操作系统
数据库
sql
mysql