Skip to main content

moregeek program

python编程(gui线程和工作线程的同步)-多极客编程_python 线程同步



    一般来说,编写gui客户端之外,都要编写几个work thread。因为如果只有一个gui thread,在某些socket或者低速io操作的时候,速度是非常慢的,所以这个时候建议多开几个thread,增加用户体验。

    增加几个work thread本身没有问题,但是gui和工作线程沟通是一个问题。一般来说,常用的方法就是在gui线程起一个timer,定时通过queue数据看一下work thread进展如何。这样虽然麻烦一点,至少逻辑上比较保险。今天看了一下wxpython下的处理办法,它使用CallAfter和CallLater、PostEvent这三个方法实现的,还是很受启发的。

1、CallAfter调用

    CallAfter调用很简单,就是work thread调用CallAfter之后,GUI thread来看这个注册的函数和变量,整个流程都是GUI自己完成的,数据也是异步交互的。

#!/usr/bin/python

import os
import sys
import wx

app=wx.App()
f=wx.Frame(None)
f.Show()

def process(data):
f.Close()

wx.CallAfter(process, '123')
app.MainLoop()

2、CallLater调用

    CallLater比CallAfter多一个时间参数,参数的基本单位是ms。所以,这里适用于进展比较缓慢的io操作,一般代码是这样的,

#!/usr/bin/python

import os
import sys
import wx

app=wx.App()
f=wx.Frame(None)
f.Show()

def process(data):
f.Close()

wx.CallLater(3000, process, '123')
app.MainLoop()

3、PostEvent方法

    还有一种方法,就是PostEvent方法。用这种方法有两个地方要注意一下。第一个地方,就是在frame里面需要用Connect函数将event_id和event_handler绑定在一起。第二个地方,就是work thread中先SetEventType,然后在线程run的时候通过PostEvent发送出去就可以了。这样event_handler函数收到信息后,就可以在GUI线程里面继续处理了。具体的使用法法,可以查看这两

4、总结

    这三种方法都适合gui线程和work thread交互,难易程度依次递增,大家可以根据自己的需求灵活加以运用。


©著作权归作者所有:来自51CTO博客作者feixiaoxing的原创作品,请联系作者获取转载授权,否则将追究法律责任

sql server 数据库分表分库操作_虚拟的现实的博客-多极客编程

1.简介 数据库高可用环境的搭建可以参考以下文章 SQL Server 高可用(always on)配置指南之域(AD)环境搭建       ​​https://blog.51cto.com/waringid/5851856​​ SQL Server 高可用(always on)配置指南之节点配置      ​​https://blog.51cto.com/waringid/5851970​​ S

alwayson故障模拟及处理方案_虚拟的现实的博客-多极客编程

1.简介数据库高可用环境的搭建可以参考以下文章SQL Server 高可用(always on)配置指南之域(AD)环境搭建     ​​https://blog.51cto.com/waringid/5851856​​ SQL Server 高可用(always on)配置指南之节点配置    ​​https://blog.51cto.com/waringid/5851970​​ SQL Se

给openwrt配置多个vlan(比如访客网络),彼此隔离以提高网络安全性_技术攀登者的博客-多极客编程

为何要给路由器配置多个VLAN?目前家庭上网设备越来越多。手机、电视上网大家都已经很熟悉了,可随着物联网(IoT)的发展,诸如指纹锁、扫地机器人、冰箱等设备也都纷纷上网。上网设备的多样性增加了网络环境的复杂性,也给网络安全提出了更高的要求。为此,我们可以在OpenWrt里给这些设备分类,把不可信的设备(诸如IoT设备,或家里访客的手机)与可信设备(自己手机)分离,以提升网络的安全性,也排除了彼此之

exchange 2013 和exchange 2019共存部署和配置_史振宁的博客的博客-多极客编程

背景 Exchange 2013 生命周期将在2023年4月份终结。升级已经势在必行。而升级过程中会存在共存阶段。本篇尽量减少文章篇幅,介绍关键部分和遇到的疑问和问题该如何解决。 共存方案 Exchange2013 需要升级到CU21之后方可和Ex2019共存,从而进一步升级为2019。 环境介绍 主机名 IP 系统版本 角色 demo-dc 172.16.7.54 2012R2

在windows 7虚拟机上安装vmware tools时遇到回滚问题的解决_匆匆的2012后突然想起了她的博客-多极客编程

我打算安装Oracle 10g作为开发数据库,但是在windows 10下安装遇到困难,再加上想减少对主OS的影响,决定安装windows 7虚拟机。但是VMWare workstations pro16和windows7虚拟机安装好后安装VMWare Tools出现回滚,在window7虚拟机中打补丁才解决,最后顺利实现了主操作系统和虚拟机操作系统之间文件共享。过程记录如下:1、下载vmware

完美方案:win7/win10下正确安装oracle 10g_匆匆的2012后突然想起了她的博客-多极客编程

我打算安装Oracle 10g作为开发数据库,但是由于Oracle 10g太老了,兼容性问题严重,在windows 10和windows 7下安装均遇到困难。经过我两天的反复摸索和实验,终于找到完美方案。记录如下:1、下载Oracle 10g 32位下载链接:https://pan.。baidu.。com/s/1OepGJvfrVv1sb3wtX9eEFg (删除句号)提取码:u4tgOracle

源码包编译_极光_code的博客-多极客编程

1. 源码编译介绍源码安装就是将开发人员写好的源码文件进行手动编译安装。目前开源软件,并不是所有的源代码都打成包,如果想使用开源软件,是需要自己下载进行编译安装。需要进行编译安装的场景:软件提供商没有做打包的操作(也就是编译源码)生产环境需要软件的某些特性,需要编译安装。但是源码编译安装是比较繁琐的一个过程,好在前辈们已经提供了相关的项目管理工具,这大大降低了编译过程的复杂性2. 开源程序源代码的

docker搭建kafka集群_wx6369307062d07的博客-多极客编程

对于个人开发者而言,一般手头上没有多台服务器,有人可能会有云服务器,不过一般也只会买一台来用用就好;有人可能更习惯将本机当作服务器来玩。都可以。那么如何通过一台服务器或本机来搭建Kafka集群呢?无外乎两种方式,一是通过docker来搭建,每台kafka broker用不同的端口来启动,即可组成集群;二是通过虚拟机来搭建,即用VMware在服务器或本机上启动多台虚拟机,每台虚拟机都安装一个kafk

[ linux ] 进程间通信介绍 管道_小白又菜的博客-多极客编程

0.进程间通信介绍0.1通信背景在之前我们学习进程时知道进程具有独立性,所以进程间交互数据的成本就变得非常高。进程之间为什么也进行进程间通信,这就需要谈谈进程间通信的目的了。但是进程具有独立性不是彻底独立,只管自己不理任何人,当然不是这样的。进程之间也是存在通信的。那么进程间通信的方式也有很多种,包括管道,System V IPC,POSIX IPC........那么今天我们先来看看进程间如何通

karmada跨集群优雅故障迁移特性解析_华为云开发者社区的博客-多极客编程

摘要:在 Karmada 最新版本 v1.3中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑。本文分享自华为云社区《​​Karmada跨集群优雅故障迁移特性解析​​》,作者:Karmada社区。在多云多集群应用场景中,为了提高业务的高可用性,用户的工作负载可能会被部署在多个集群中。然而当某个集群发生故障时,为保证业务的可用性与连续性,用户希望故障集群上的工作负载被自动的迁移到其他条件适

fastdfs的安装和使用_wx6369307062d07的博客-多极客编程

fastdfs是用 c 语言编写的一款开源的分布式文件系统,有多种原因的客户端(包括有Java的客户端)。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。fastdfs架构包括 Tracker server 和 Storage server。客户端请求 

shell脚本中实现自动输入密码---expect安装使用_雍州无名的博客-多极客编程

expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send),由于linux系统默认不安装此工具,所以使用前先进行安装。1.安装 expectyum install expect2.实现自动输入密码例子#!/usr/bin/expectspawn mysql_config_edit