先看下面的FMX.Layouts.pas中一段代码

procedure TCustomScrollBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Single);
begin
FMouseEvents := True;
inherited;
if (Button = TMouseButton.mbLeft) then
begin
MousePosToAni(X, Y);
AniMouseDown(ssTouch in Shift, X, Y);
end;
end;

在执行Inherited;这行时可能会调用控件的OnDblClick事件,如果此时在OnDblClick中将Form或控件释放了,后面调用MousePosToAni可能就会造成内存访问异常

因此最好能够在UI线程(主线程)中执行MouseDown完全后,再调用Form或控件的释放,如下面

procedure TForm1.OnListBox1Item1DblClick(Sender:TObject);
begin
....//处理一些事情
AsyncCallInUIThread(
procedure
begin
Self.DisposeOf; //延迟释放,防止内存访问异常
end);
end;

  

下面是AsyncCallInUIThread的实现:

procedure AsyncCallInUIThread(Proc: TProc);
begin
TThread.CreateAnonymousThread(
procedure
begin
Sleep(0);
TThread.Synchronize(nil,
procedure
begin
Proc;
end);
end).Start;
end;

  

Delphi Firemonkey在主线程 异步调用函数(延迟调用)的更多相关文章

  1. 如何让 Qt 的程序使用 Sleep(主线程没有Sleep函数,但线程可用自带的保护函数Sleep)

    熟悉的陌生人 Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道.,只是你可能没有意识到: QCoreApplicaton::exec() QApplication ...

  2. FastReport调用Delphi中的人民币大写转换自定义函数

    FastReport调用Delphi中的人民币大写转换自定义函数   FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...

  3. android 和主线程有关的小问题

    1.在android 中 HTTP请求被不允许在主线程中执行,否则会抛出异常.如果请求时间过长,阻塞UI线程是一个非常差的体验之前,刚开始开发遇到这个问题,每次app运行到最后,发送网络请求就自己崩溃 ...

  4. iOS 安全地在主线程执行一个Block

    //主线程同步队列 #define dispatch_main_sync_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } else { ...

  5. node.js调用函数

    首先EditPlus编辑器,打开新建的文本文档,另存为副本 调用函数分为调用本地函数,和其他文件的函数 1.调用本地函数 var http = require('http'); http.create ...

  6. iframe标签的子父页面调用函数和属性

    在使用iframe标签时,总想通过子页面调用父页面的一些方法和属性.今天终于发现了. 1在父页面写一个函数 //让子页面来调用此方法,控制导航栏 function childfunc(){ alert ...

  7. python两个类之间变量和函数的调用

    1.class_a() class_b() 2.class_b使用class_a中的变量和函数 3.变量class_a中:class_a.num=... 函数class_b中:先实例化class_a( ...

  8. Day5 - 01 函数及函数的调用概念

    函数就是最基本的一种代码抽象的方式.函数只需写一次,就可以多次调用.Python本身内置了很多有用的函数,可以直接调用. 调用函数    要调用一个函数,需要知道函数的名称和参数.可以通过help(x ...

  9. day14函数递归调用

    day14函数递归调用 1.装饰器叠加 def deco1(func1): def wrapper1(*args,**kwargs): print('=====>wrapper1 ') res1 ...

随机推荐

  1. SQL点点滴滴_SQL分页查询

    假如tb_customer表中的数据量非常大,在显示时要分页显示而且每页只显示10条信息.为了效果我们取第三页的数据. 方法一:遍历两次表,取不同的数据. select top 10 * from t ...

  2. daD

    Linux centos7环境下MySQL安装教程_Mysql_脚本之家 脚本之家 软件下载 android软件 MAC软件 驱动下载 字体下载 DLL下载 源码下载 asp源码 php源码 asp. ...

  3. 计算机应用基础PPT flash作业

  4. Java实例---简单的个人管理系统

    代码分析 FileOperate.java package com.ftl.testperson; import java.io.File ; import java.io.FileInputStre ...

  5. JMeter中文版用户手册

    1.1 简介 使用JMeter通常会有以下步骤: 1.1.1 创建测试计划 首先,运行JMeter图形化界面. 然后在文件菜单中选择Templates…->Recording,通过浏览器录制We ...

  6. IntelliJ IDEA常用设置(转)

    IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...

  7. Angular Reactive Form-响应式表单验证

    内建验证规则 Angular中提供了一些內建的Validators,这些验证规则可以在Template-Driven或Reactive表单中使用. 目前 Angular 支持的内建 validator ...

  8. 前端——实用UI组件库

    Angular UI 组件 ngx-bootstrap 是一套Bootstrap 组件 官网:https://valor-software.com/ngx-bootstrap/#/ github: h ...

  9. layui渲染form表单

    有时ajax请求的数据返回时,页面已经加载了,此时就无法展示ajax加载的内容,如果要局部刷新表单,则加上如下代码: layui.use('form', function() { var form = ...

  10. Java并发案例04---生产者消费者问题03--使用ReentrantLock

    /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notif ...