FMX中实现PostMessage的方法
首先,做为一个从Windows下转过来的开发人员,许多时候,我们喜欢用PostMessage来触发一些异步执行的代码,但遗憾的是,FMX做为EMB的跨平台库的基础,只提供了SendMessage方法,却没有提供PostMessage方法。
那我们确实需要PostMessage怎么办?我因为用到了,所以研究了下,编写了一个fmx.postqueue单元,提供了一个类似的PostMessage方法,供大家参考。此代码可以运行在跨平台环境下,所以你可以放心在Windows、Andriod、iOS、OSX中使用。
第一步:我不喜欢消息映射的方式,所以直接PostMessage的定义我改了一下,让其更简单易用。
1
2
3
|
type
TPostProcedure=procedure (ASender:TObject;AMsgId:Integer;AWParam,ALParam:NativeInt) of object;
procedure PostMessage(ACallback:TPostProcedure;ASender:TObject;AMsgId:Integer;AWParam,ALParam:NativeInt);
|
首先是一个消息响应过程,如果你将所有的异步消息响应过程都投寄到同一个函数,那基本上就是Windows上的PostMessage函数的翻版了,你只能在回调函数中根据消息ID挨个处理了。
TPostProcedure提供了四个参数:
ASender : 消息的发送者,如果不需要,可以传递为nil/NULL。
AMsgId : 消息ID,一个整数值,如果不需要区分,直接赋0就好了。
AWParam : 一个附加的参数,具体由程序自己决定,和Windows下消息的WParam参数一样。
ALParam : 同上
接口就是这么一个简单的定义了,用时直接在后台线程或主线程中PostMessage就可以,这个函数是线程安全的。
第二步:我来详细说明下这个函数的实现原理。
1、自己建立一个内部列表,用来存贮投寄来的消息。
2、注册一个用于响应TIdleMessage消息的回调函数,在其中处理这些异步消息的响应。
3、在投寄消息时,将消息加入到内部列表,然后如果定义了WakeMainThread函数,就调用WakeMainThread函数,从而激活主线程的消息循环,用于处理异步消息。
基本的思路就是这个样子,而后面实际还注册了退出过程,用来清理自身,防止内存泄露。
【下载链接】
http://blog.qdac.cc/?p=1090
FMX中实现PostMessage的方法的更多相关文章
- 在FMX中实现PostMessage的方法
在FMX中实现PostMessage的方法 http://www.qdac.cc/?p=1090 2014-10-31 • Android.C++ Builder.Delphi.杂谈 • 4条评论 • ...
- html5中的postMessage解决跨域问题
解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- Eclipse中自动提示的方法参数都是arg0,arg1的解决方法
Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...
- Power BI官方视频(2) Power BI嵌入到应用中的3种方法
今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...
- JQuery中each()的使用方法说明
JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...
- Dedecms去掉URL中a目录的方法
本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...
随机推荐
- mysql常用控制台命令
作者:朱金灿 来源:http://blog.csdn.net/clever101 1.登陆mysql,语法为:mysql -u[用户名] -p[密码],示例:mysql -uroot -p123456 ...
- 【21.21%】【codeforces round 382D】Taxes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- WPF 高速书写 StylusPlugIn 原理
原文:WPF 高速书写 StylusPlugIn 原理 本文告诉大家 WPF 的 StylusPlugIn 为什么能做高性能书写,在我的上一篇博客和大家介绍了 WPF 的触摸原理,但是没有详细告诉大家 ...
- myeclipse 8.6 software and workspace center is currently not available
Myeclipse安装EGit插件的时候偏偏遇到software and workspace center is currently not available 不用打开myeclipse conf ...
- 《用户体验要素》澄清了 UI 原型设计中看不见确感受得到的那一层
<用户体验要素>澄清了看不见确感受得到的那一层 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&quo ...
- Struts2中文件的上传与下载
文件上传 1.jsp页面 <s:form action="fileAction" namespace="/file" method="POST& ...
- Leetcode 268 Missing Number 位运算
题意:先将0, 1, 2, ..., n放入数组,然后去掉其中一个值,找到那个值. 这题与singe number 是一个类型,变形的地方就是首先需要将0, 1, 2, ..., n再次放入这个数组, ...
- Win32 键盘事件 - 击键消息、字符消息、插入符号(光标)
注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 以下内容主 ...
- Fedora15下搭建QT开发环境及编译QT(提前一键安装完,qt编译所有必需库 yum install gcc-c++ libXtst-devel freetype freetype-devel fontconfig-devel libXrender-devel )
看了不少linux上编译qt的文章,实际上直接通过yum 安装qt是最方便的,请参考<yum安装qt> 不过初步接触fedora,为了了解一下如何在linux上编译.安装开源代码,所以必须 ...
- Nginx之Eclipse开发环境配置
C开发的IDE很多,为什么使用Eclipse?原因: 1. 历史原因:使用eclipse时间长,比较熟悉. 2. 功能原因:使用eclipse查看源码,可以在各个函数与头文件间直接跳转.这是所谓号称& ...