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

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

【下载链接】

百度网盘

最新文章

  1. Ubuntu root 密码 sudo passwd
  2. SPOJ COT3 Combat on a tree(Trie树、线段树的合并)
  3. Angular学习(3)- 双向梆定
  4. Struts2笔记——result结果类型
  5. mysql日期加减问题
  6. 计数方法(扫描线):JLOI 2016 圆的异或并
  7. 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成
  8. tomcat中debug启动和start启动的区别
  9. 【Sort】HeapSort
  10. 芯灵思Sinlinx A64开发板设置qt程序自启动
  11. vim学习之git for windows
  12. socket.io笔记三之子命名空间的socket连接
  13. httpclient httpclient使用连接池
  14. CC2530自动安全联网
  15. spider-抓取网页内容(Beautiful soup)
  16. 【Shader】这是一篇记录随笔,我要开始学Shader了!
  17. Bootstrap学习js插件篇之滚动监听
  18. Win10累积更新KB3081424安装失败的解决方法
  19. JavaWeb -cookie&session&application
  20. 得到DataGrid列的值

热门文章

  1. ultraedit替换所有空白行 --正则表达式使用
  2. Global build settings
  3. Linux中应用程序如何使用系统调用syscall
  4. chrome加载本地js
  5. Windows系统结构
  6. Android 读取手机SD卡根目录下某个txt文件的文件内容
  7. java_接口的应用
  8. QTableWidget查找指定项(由github处学习到)
  9. 使用gfortran将数据写成Grads格式的代码示例
  10. openssl 非对称加密算法RSA命令详解