首先,做为一个从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

最新文章

  1. PHP: How to print a debug log?
  2. JS错误 theForm.submit();SCRIPT3: 找不到成员。
  3. [算法]A General Polygon Clipping Library
  4. 将一堆石子分成多堆——Multi-SG 游戏
  5. bootstrap3-typeahead 自动补全
  6. 六款值得推荐的android(安卓)开源框架简介【转】
  7. POJ 1442 Black Box 堆
  8. 为什么针对XML的支持不够好?如何改进?
  9. 那两年炼就的Android内功修养
  10. 有关va_list和vsnprintf输出函数的问题
  11. HDU 5919 Sequence II(可持久化线段树)
  12. Kubernetes使用cephfs作为后端存储
  13. neo4j 数据库导入导出
  14. Can you find it?
  15. Django 【认证系统】auth
  16. fifo 实现问题
  17. JS学习笔记Day9
  18. 金蝶K/3 报销相关SQL语句
  19. React 生命周期简介
  20. 环境部署(二):Linux下安装jenkins

热门文章

  1. python于lxml应用
  2. git如何更新fork的repository(Fork一个别人的repository,做了一些改动,再合并别人的更新)
  3. TEdit,TMemo背景透明(SetWindowLong(WS_EX_TRANSPARENT)增加透明风格)
  4. tap code —— 两个一位数字编码一个字母
  5. base64编码转图片
  6. WinForm - 窗体淡入效果界面的简单实现方法
  7. STL之适配器
  8. wxWidgets初学者导引(3)——wxWidgets应用程序初体验
  9. σ 代数与测度(measures)
  10. WPF多点触摸放大缩小旋转