zoukankan      html  css  js  c++  java
  • FMX中实现PostMessage的方法

    首先,做为一个从Windows下转过来的开发人员,许多时候,我们喜欢用PostMessage来触发一些异步执行的代码,但遗憾的是,FMX做为EMB的跨平台库的基础,只提供了SendMessage方法,却没有提供PostMessage方法。
    那我们确实需要PostMessage怎么办?我因为用到了,所以研究了下,编写了一个fmx.postqueue单元,提供了一个类似的PostMessage方法,供大家参考。此代码可以运行在跨平台环境下,所以你可以放心在Windows、Andriod、iOS、OSX中使用。

    第一步:我不喜欢消息映射的方式,所以直接PostMessage的定义我改了一下,让其更简单易用。

    首先是一个消息响应过程,如果你将所有的异步消息响应过程都投寄到同一个函数,那基本上就是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

  • 相关阅读:
    beautifulsoup部分知识点
    navicat 结合快捷键
    byte[i] & 0xFF原因(byte为什么要与上0xff?)
    Java parseInt()和parseFloat()的用法
    parse 方法
    getTime()和parse()的区别
    使用SQL Profiler trace(2005)的经验分享(新建跟踪、分析跟踪文件)
    DWZ使用笔记
    js中 json详解
    src与href属性的区别
  • 原文地址:https://www.cnblogs.com/findumars/p/5482257.html
Copyright © 2011-2022 走看看