在FMX中实现PostMessage的方法

http://www.qdac.cc/?p=1090

2014-10-31 • AndroidC++ BuilderDelphi杂谈 • 4条评论 • swish •浏览 1,168 次

首先,做为一个从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函数,从而激活主线程的消息循环,用于处理异步消息。

基本的思路就是这个样子,而后面实际还注册了退出过程,用来清理自身,防止内存泄露。

【下载链接】

百度网盘

在FMX中实现PostMessage的方法的更多相关文章

  1. FMX中实现PostMessage的方法

    首先,做为一个从Windows下转过来的开发人员,许多时候,我们喜欢用PostMessage来触发一些异步执行的代码,但遗憾的是,FMX做为EMB的跨平台库的基础,只提供了SendMessage方法, ...

  2. html5中的postMessage解决跨域问题

    解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...

  3. JavaScript中Math对象的方法介绍

    1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...

  4. Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...

  5. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  6. Eclipse中自动提示的方法参数都是arg0,arg1的解决方法

    Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...

  7. Power BI官方视频(2) Power BI嵌入到应用中的3种方法

    今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...

  8. JQuery中each()的使用方法说明

    JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...

  9. Dedecms去掉URL中a目录的方法

    本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...

随机推荐

  1. MVC3路由设置访问后缀 html jsp

     C# Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546   publ ...

  2. Android之断点续传下载

    今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...

  3. js深入研究之无法理解的js类代码,extend扩展

    <script type="text/javascript"> function Person(name) { this.name = name; } Person.p ...

  4. vs2008包加载失败

    由于安装vs2008sp1后,新建项目报错,解决未遂,于是重装vs2008,装完后又出现包加载失败问题: Microsoft.Data.Entity.Design.Package.MicrosoftD ...

  5. Java常见内存溢出异常分析(OutOfMemoryError)

    原文转载自:http://my.oschina.net/sunchp/blog/369412 1.背景知识 1).JVM体系结构 2).JVM运行时数据区 JVM内存结构的相关可以参考: http:/ ...

  6. MyBatis配置解析

    MyBatis配置文件解析(概要) 1.configuration:根元素 1.1 properties:定义配置外在化 1.2 settings:一些全局性的配置 1.3 typeAliases:为 ...

  7. ORACLE SEQUENCE 介绍

    在oracle中sequence就是所谓的序列号,每次取的时候它会自己主动添加,一般用在须要按序列号排序的地方.  1.Create Sequence  你首先要有CREATE SEQUENCE或者C ...

  8. uva 11081 - Strings(LCS)

    题目链接:11081 - Strings 题目大意:给出三个字符串,从分别从第一个字符串和第二个字符串中挑选子串a,b,用a和b组成第三个字符串,问可组成的子串有多少种. 解题思路:说起来惭愧啊,题目 ...

  9. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  10. 线程、线程句柄、线程ID

     什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...