首页 > 编程语言 >【PuepleMoon】事件驱动编程[0]

【PuepleMoon】事件驱动编程[0]

时间:2023-08-26 14:26:07浏览次数:53  
标签:me status wm 编程 事件驱动 事件 PuepleMoon WM

事件驱动编程【0】

事件驱动流程

  • 每个应用程序属于一个事件泵或者称为消息循环 是每个事件驱动中最重要的部分。
  • 调用获取消息窗口API框以非阻塞获取一个输入事件消息。
  • 当任何这类事件发生时,等待来自鼠标或着键盘或者触摸屏的输入事件消息,并将其记录为一个消息对象并将其放置在此应用程序的消息队类当中。
  • 获取消息并且解除阻塞,将消息从队列复制出来到MSG对象,这就表示接收到一个事件。
  • 最后是处理消息事件。

事件循环的关键属性


三个重要关键属性

特殊消息

事件循环将使用特殊消息对象来记录所有可能对此应用程序感兴趣的事件,此事件对象仅用于通信并且可以方便的存储在事件队列中占用小小的队列内存(意味着在驱动中事件对象解析出来的输入事件才是最后的结果),保证可以在任何时候传递,系统将之记录 事件作为消息放置在消息队列当中但不等待消息的处理(这意味着这是一个异步机制)。

DISPATCH消息

消息的调用在下一事件之前完成并且回到事件循环,这意味着事件处理在运行中进行RTC(run-to-completion)步骤,不能被任何其他事件处理中断(在裸机中可以考虑全局中断的关闭)。

应用程序代码

在实时操作系统中,应用程序会调用某个艺术家的服务函数,事件驱动将调用应用程序,这将导致一个IOC(inversion of control)控制反转,这意味着引用事件和驱动应用程序取消引用不是相反的。

最后再谈谈顺序编程与事件驱动编程

举个例子:

事件驱动的钩子函数中将处理所有的时间逻辑,并且根据事件的类型快速的定位用户的事件响应。

一个简单的输入事件驱动:

点击查看代码
LRESULT CALLBACK WINPROC(HWND me, UINT sig, WPARAM wparam, LPARAM lparam)
{
	static int wm_keydown_ctr		=0;
	static int wm_mousemove_ctr		=0;
	
	LRESULT status;
	
	switch(sig)
	{
		case WM_CREATE:{
			status = WIN_HANDLED;
			break;
		}
		case WM_DESTROY:{
			postquitmessage(0);
			status = WIN_HANDLED;
			break;
		}
		case WM_PAINT:{
			PAINTSTRUCT ps;
			HDC hdc;
			RECT rect;
			char cBuffer[100]
			wsprintf(cBuffer,"KEYBORD = %3d,MOUSE = %3d",(wm_keydown_ctr%1000),(wm_keydown_ctr%1000));
			
			hdc = BeginPaint(me,&ps);
			GetClientRect(me,&rect);
			DrawText(hdc,cBuffer, -1, &rect,DT_SIGNALLINE | DT_CENTER | DT_VCENTER);
			EndPaint(me,&ps);
			
			status = WIN_HANDLED;
			break;
		}
		case WM_KEYDOWN:{
			++wm_keydown_ctr;
			InvalidateRect(me, NULL, false);
			
			status = WIN_HANDLED;
			break;
		}
		case WM_MOUSEMOVE:{
			++wm_mousemove_ctr;
			InvalidateRect(me, NULL, false);
			
			status = WIN_HANDLED;
			break;
		}
		default:{
			/*这意味着自己指定的特殊方式块 将被转向更高层次的编程解决*/
			status = DefwindowProc(me, sig, wparam, lparam);
		}
	}
	//根据返回值表示如何处理
	return status;
}
当产生输入事件时,我们假设LED即将闪烁:
case WM_KEYDOWN:{
		++wm_keydown_ctr;
		LED_ON;
		InvalidateRect(me, NULL, false);//将窗口设置为无效
		
		sleep(200);
		
		LED_OFF;
		InvalidateRect(me, NULL, false);
		
		status = WIN_HANDLED;
		break;
	}

那么结果是什么呢:
当产生输入事件时,程序将被冻结,并且不会立即更新键盘计数,假如输入多个按键这将变得更加糟糕。

所以这意味着事件发布与排队遭到了难以忽略的阻塞,这将导致你的程序开始睡眠,延迟会阻止你的窗口过程。

事实上我们需要对事件驱动进行一个简单的了解:我们称这个事件泵"THIS IS A PIG",所以如果不希望你的程序变成一只PIG,我们就需要通过事件驱动的方式来解决事件驱动的问题。

case WM_TIMER:{
	++wm_keydown_ctr;
	LED_OFF;
	InvalidateRect(me, NULL, false);	//将窗口设置为无效
	KillTimer(me ,wparam);			//杀死定时器事件
	
	status = WIN_HANDLED;
	break;
}
case WM_KEYDOWN:{
	++wm_keydown_ctr;
	LED_ON;
	InvalidateRect(me, NULL, false);	//将窗口设置为无效
	SetTimer(me, 1, 200, NELL);		//设置200Ms timer
	status = WIN_HANDLED;
	break;
}

当我们遇到需要超过100Ms的事件时,最好是将其分割呈不断大小的片时间,进行处理。

写在末尾

上述为本人浅短的认知与学习,望交流指正学习,感谢。

标签:me,status,wm,编程,事件驱动,事件,PuepleMoon,WM
From: https://www.cnblogs.com/Purple-Moon/p/17656648.html

相关文章

  • 基于springboot编程训练系统设计与实现
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足,创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了......
  • 面试类-Java编程(二)
    18.说一下你对Java内存模型(JMM)的理解?Java内存模型(JavaMemoryModel,JMM),是一种抽象的模型,被定义出来屏蔽各种硬件和操作系统的内存访问差异。JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory),本地内......
  • 无涯教程-Python - 网络编程
    本章将使您对网络-Socket编程中最著名的概念有所了解。Socket是双向通信通道的端点。Socket可以在一个进程内,同一台机器上的进程之间或不同大陆上的进程之间进行通信。Socket可以在许多不同的通道类型上实现:Unix域Socket,TCP,UDP等。socket库提供用于处理常见传输的特定类以......
  • 并发编程的优缺点
    为什么要使用并发编程(并发编程的优点)•充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升•方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并......
  • python网络编程
    1.套接字套接字(Socket)是实现网络编程进行数据传输的一种技术手段,网络上各种各样的网络服务大多都是基于Socket来完成通信的。socket是传输层提供给应用层的编程接口。所以,套接字socket编程分为TCP与UDP两类。在python中,通过Python套接字编程模块:importsocket提供socket......
  • QT-网络编程
    说明当涉及Qt网络编程时,通常会使用Qt提供的网络模块,其中最常用的是QTcpSocket和QTcpServer类QTcpSocketQTcpSocket是Qt网络模块中的一个类,用于实现TCP客户端的网络通信。它提供了一个接口,允许你连接到远程主机并在网络上发送和接收数据1.构造函数QTcpSocket(QOb......
  • c# .NET 高级编程 高并发必备技巧 - 锁
    锁最为常见的应用就是高并发的情况下,库存的控制。本次只做简单的单机锁介绍。直接看代码:每请求一次库存-1.假如库存1000,在1000个人请求之后,库存将变为0。publicintReduce0(){intr=0;stringkey="stock";stringstoc......
  • Android并发编程高级面试题汇总(含详细解析 九)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • 钡铼技术BL102 PLC网关教程:如何使用4G网络连接西门子PLC进行远程编程?
    1、打开网关配置软件,点击“搜索”,搜索局内网网关BL1022、搜索到的网关设备,选择要配置的设备,双击登录3、输入登录密码登录,默认是1234564、配置网关网口采集PLC,远程下载暂时只支持LAN口下PLC设备。示例S7-200SMART的IP地址是192.168.5.16。故点击LAN修改IP地址为:192.168.5.1,点击OK。......
  • 编程真好玩Python_2.1你的第一个程序HelloWorld
    一、作业效果。(1)程序首先显示信息:“你好,世界!”(2)询问你的名字(3)输入后,屏幕显示“你好,×××!”二、完成(1)新建文件夹,保存-命名(2)运行代码print("Hello,World!")person=input("Whatisyourname?\n")print("Hello,",person)(3)在编辑窗口中,选择Run-RunModule,运行程序......