wxWidgets的ProcessEvent() 和QueueEvent()的用法和区别

news2024/11/24 11:57:04

目录

ProcessEvent()

参数

返回值

QueueEvent()

函数加入版本

参数


ProcessEvent()

virtual bool wxEvtHandler::ProcessEvent (wxEvent & event)

处理事件,搜索事件表并调用零个或多个合适的事件处理函数。

通常,您的应用程序不会调用此函数:它是在wxWidgets实现中调用的,用于将传入的用户界面事件分派给框架(和应用程序)。

但是,如果您在实现新功能(如新控件)时需要定义新的事件类型,而不是允许用户重写虚函数,那么您可能需要调用它。

请注意,您通常不需要重写ProcessEvent()来自定义事件处理,重写特别提供的TryBefore()和TryAfter()函数通常就足够了。例如,wxMDIParentFrame可以重写TryBefore()以确保在父框架本身处理之前,菜单事件在活动的子框架中被处理。

事件表搜索的正常顺序如下:

1.调用wxApp::FilterEvent()。如果它返回的不是-1(默认值),则处理在此处停止。
2.调用TryBefore()(这是考虑wxValidator对wxWindow对象影响的地方)。如果此函数返回true,则函数退出。
3.如果对象被禁用(通过调用wxEvtHandler::SetEvtHandlerEnabled),则函数跳至步骤(7)。
4.按从最近绑定到最早绑定的顺序搜索使用Bind<>()绑定的处理程序的动态事件表。如果找到处理程序,则执行它,并且除非处理程序使用wxEvent::Skip()指示它未处理该事件(在这种情况下搜索继续),否则函数返回true。

5.在源代码中,按照事件表宏出现的顺序,搜索使用事件表宏绑定的处理程序的静态事件表以查找此事件处理程序。如果失败,则尝试基类事件表,依此类推,直到没有更多表或找到合适的函数为止。如果找到处理程序,则应用与前面步骤相同的逻辑。

6.搜索应用于整个事件处理程序链(通常链的长度为1)。此链可以使用wxEvtHandler::SetNextHandler()形成:

(参考图像,如果A->ProcessEvent被调用且未处理该事件,则会调用B->ProcessEvent,依此类推...)。请注意,在wxWindow的情况下,您可以构建事件处理程序的堆栈(有关更多信息,请参阅wxWindow::PushEventHandler())。如果链中的任何处理程序返回true,则函数退出。

7.调用TryAfter():对于wxWindow对象,这可能会将事件递归地传播到窗口父级。如果事件仍未被处理,则作为最后一步,将调用wxTheApp对象上的ProcessEvent()。

请注意,步骤(2)至(6)在ProcessEventLocally()中执行,该函数由本函数调用。

参数

event 要处理的事件。

返回值

如果找到并执行了合适的事件处理程序函数,且该函数没有调用wxEvent::Skip,则返回true。

在wxWindow中重新实现。


QueueEvent()

virtual bool wxEvtHandler::QueueEvent (wxEvent * event)

将事件排队以便稍后处理。

这个方法类似于 ProcessEvent(),但后者是同步的,即事件在函数返回之前立即被处理,而这个方法是异步的,它会立即返回,事件将在稍后的某个时间(通常是在下一个事件循环迭代期间)被处理。

另一个重要的区别是,这个方法拥有对事件参数的所有权,即它自己会删除它。这意味着事件应该在堆上分配,且函数返回后,指针不能再被使用(因为它可能随时被删除)。

QueueEvent() 可以用于工作线程与主线程之间的线程间通信,它在内部使用锁定,是安全的,可以避免在 AddPendingEvent() 文档中提到的问题,确保事件对象不再被调用线程使用。然而,仍需注意避免使用此对象的某些字段,特别是事件对象的任何 wxString 成员都不应该是另一个 wxString 对象的浅拷贝,因为这会导致它们仍然在后台使用相同的字符串缓冲区。例如:

void FunctionInAWorkerThread(const wxString& str)
{
wxCommandEvent* evt = new wxCommandEvent;

// NOT evt->SetString(str) 因为这将是浅拷贝
evt->SetString(str.c_str()); // 进行深拷贝

wxTheApp->QueueEvent( evt );
}

注意,您可以使用 wxThreadEvent 而不是 wxCommandEvent 来避免这个问题:

void FunctionInAWorkerThread(const wxString& str)
{
wxThreadEvent evt;
evt.SetString(str);

// wxThreadEvent::Clone() 确保内部的 wxString
// 成员不会被其他 wxString 实例共享:
wxTheApp->QueueEvent( evt.Clone() );
}

最后请注意,此方法通过调用wxWakeUpIdle()自动唤醒空闲的事件循环,因此在使用此方法时无需手动执行。


函数加入版本

自2.9.0版起

参数

event 要排队的堆分配事件,QueueEvent()将拥有它。此参数不应为NULL。

在wxWindow中重新实现。
 

// END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1523352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python算法100例-4.1 将真分数分解为埃及分数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.补充知识点5.确定程序框架6.完整的程序 1&#xff0e;问题描述 现输入一个真分数&#xff0c;请将该分数分解为埃及分数。 2&#xff0e;问题分析 真分数&#xff08;a proper…

苹果Vision Pro即将在中日韩等九国开卖 | 百能云芯

苹果公司近期透露&#xff0c;首款混合实境&#xff08;MR&#xff09;头盔「Vision Pro」即将在今年晚些时候推向更多国家销售。虽然苹果尚未公布具体的销售细节&#xff0c;但根据最新的外媒报道&#xff0c;这款高科技产品可能即将在中国、日本、韩国等九个国家开卖&#xf…

Linux字符设备驱动开发一

linux字符设备驱动 0 驱动介绍1 字符设备驱动1.1 字符设备相关概念和结构体1.2 实现简单的字符设备模块1.3 创建字符设备1.4 总结 应用程序调用文件系统的API(open、close、read、write) -> 文件系统根据访问的设备类型&#xff0c;调用对应设备的驱动API -> 驱动对硬件进…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

叠加积分法计算电场强度

目录 电场强度 点电荷 体电荷 面电荷 ​编辑线电荷 基础知识&#xff1a;静电场--电场强度-CSDN博客 电场强度 点电荷 由于电场强度与产生电场的点电荷的电荷量成正比。场与源之间的这种线性关系可以用叠加原理来计算n个点电荷所形成的电场强度&#xff0c;即在电场中某一…

PyTorch学习笔记之激活函数篇(一)

文章目录 1、Sigmoid函数1.1 公式1.2 对应图像1.2 生成图像代码1.4 优点与不足1.5 torch.sigmoid()函数 1、Sigmoid函数 1.1 公式 Sigmoid函数的公式&#xff1a; f ( x ) 1 1 e − x f(x) \frac{1}{1e^{-x}} f(x)1e−x1​ Sigmoid函数的导函数&#xff1a; f ′ ( x ) e …

7.Java整合MongoDB—项目创建

整合MongoDB MongoDB的基本知识有所了解之后&#xff0c;我们开始着手上代码了&#xff0c;进来先来项目创建&#xff0c;如何引入mongodb&#xff0c;以及测试一下能否连接数据库。 1 新建springboot项目 其实只需要spring boot mongodb这个依赖就行&#xff0c;加那么多纯属…

ChatGLM3-6B独立部署提供HTTP服务failed to open nvrtc-builtins64_121.dll

背景 我在本地windoes部署ChatGLM3-bB&#xff0c;且希望部署后能提供HTTP server的能力。 模型部署且启动是成功了&#xff0c;但是在访问生成接口/v1/chat/completions时报错failed to open nvrtc-builtins64_121.dll。 问题详细描述 找不到nvrtc-builtins64_121.dll Runtime…

京瓷喷头官方参数

KJ4B-QA06NTB-STDV喷墨打印头专为高速单程、多程和多程水基油墨应用而设计。 它利用2656个直径为108mm的喷嘴&#xff0c;以75m/min的速度提供600dpi600dpi的分辨率。 由于采用宽印刷宽度、高密度喷嘴布置和高响应墨道设计&#xff0c;其生产效率和稳定性在纺织印刷、高速辊送印…

手机也能写前段代码,推荐一款万能编程软件

Python是一种强大的编程语言&#xff0c;广泛应用于各个领域&#xff0c;包括移动应用开发。如果你想在手机上进行Python编程&#xff0c;那么选择合适的软件工具就显得尤为重要。 一.python Pydroid 3 Pydroid 3是一款专为Android设备打造的Python IDE。它提供了一个完整的开…

【Canvas与艺术】下雪籽特效

【要点】 控制一个点的x,y坐标及下落速度&#xff0c;就能画出一个雪籽&#xff1b;创建n个雪籽&#xff0c;下雪籽的模拟效果就有了。 【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content…

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据 使用环境: ubantu16 QT5.7 开发板GEC6818 实现要求&#xff1a; 利用A53按键1、按键2与温湿度传感器完成QT界面动态显示温湿度记录&#xff0c;并指定温湿度记录超过指定范围&#xff0c;进行报警&#xff08;LED&#…

Grass推出Layer 2 Data Rollup

Grass推出Layer 2 Data Rollup Grass邀请链接最新资讯 Grass邀请链接 欢迎使用我的邀请码进行注册: 邀请链接 如果你还不知道注册流程&#xff1a;详见Grass: 出售闲置带宽实现被动收入 最新资讯 简讯&#xff1a;2024年3月13日&#xff0c;Grass宣布正在建立基于Solana的La…

【Linux系列】计算机系统中的架构与发行版:理解与区分

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux】进程信号{初识信号/常见的信号/中断信号/信号的产生}

文章目录 0.浅谈中断信号1.初识信号2.中断信号3.信号的产生测试&#xff1a;SIGINT 4.core dump核心转储5.系统接口产生信号5.1kill给指定发5.2raise向自己发5.3abort自己给自己发6 6.由于软件条件不满足产生信号6.1SIGPIPE6.2SIGALRM 7. 硬件异常产生信号7.1除零错误7.2野指针…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述&#xff1a; 回文串是指一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等。要求输入 一个字符串&#xff0c;判断此字符串是否为回文。&#xff08;注&#xff1a;设字符串长度小于20&#xff09; 任务要求&#xff1a; package suanfa;import…

python--类和对象+类属性+实例属性+函数在类的调用

python--类和对象类属性实例属性函数在类的调用 类属性--创建、访问&#xff08;类、类实例&#xff09;实例属性--创建、访问&#xff08;类实例&#xff09;初始化实例属性__init__ 私有属性伪私有属性&#xff08;Pseudo-private Attributes&#xff09;私有属性&#xff08…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点&#xff1a; 缺点&#xff1a; 四、改进与完事 LDM代表作 原理概括 Latent Space&#xff08;潜空间&#xff09; 五、总结 引…

zookeeper快速入门一:zookeeper安装与启动

本文是zookeeper系列之快速入门中的第一篇&#xff0c;欢迎大家观看与指出不足。 写在前面&#xff1a; 不影响教程&#xff0c;笔者安装zookeeper用的是WSL(windows下的linux子系统&#xff09;&#xff0c;当然你想直接在windows上用zookeeper也是可以的。 如果你也想用ws…

MinGW64 windows gcc编译器安装

下载编译好的文件包 https://sourceforge.net/projects/mingw-w64/ 打开网址 界面左上方 点File 滚轮 滚到下面 点 红框 解压 配置path 环境变量