Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc。

如果有BThread,调用了BThread.Synchronize(BProc),而BProc中释放了AThread

procedure TBThread.BProc
begin
AThread.Terminate;
AThread.WaitFor;
AThread.Free;
end;

此时我们的程序将会卡死,下面的代码可以避免死锁,是通用的线程等待结束代码。

    AThread.Terminate;
while not AThread.Finished do
begin
if GetCurrentThreadID = MainThreadID then //由于是通过Synchronize同步到主线程执行,所以调用CheckSynchronize,防止死锁
CheckSynchronize(); Sleep();
end;
FreeAndNil(AThread);

如果以前没注意此重入问题,请修改你的代码吧。因为不能保证我们的代码被其他人用时不会出现重入。

此代码既支持Windows,也支持Android

不过包含的单元不一样:

uses System.SyncObjs,
{$ifdef MSWINDOWS}
Windows;
{$endif}
{$ifdef POSIX}
Posix.Pthread;
{$endif}

Delphi主线程重入而导致程序卡死的解决方案的更多相关文章

  1. Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

    Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被 ...

  2. 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)

    今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那 ...

  3. delphi 主线程向子线程发送消息

    while True do begin if not PeekMessage(msg,0,0,0,PM_REMOVE) then begin case MsgWaitForMultipleObject ...

  4. urllib2.urlopen超时未设置导致程序卡死

    没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给urlopen加上timeout就ok了,设 ...

  5. STM32 HAL_Deleay() 函数 导致程序卡死

    出现问题场景:   我的程序有RTOS操作系统.使用的驱动库是STM32官方最新的HAL库. 移植好LwIP以太网协议后,在初始化网卡阶段程序卡死.   出现问题原因:   后经过蠢笨的printf打 ...

  6. C#中多线程写DataGridView出现滚动条导致程序卡死(无响应)的解决办法

    因为写的程序涉及到多线程维护一个DataGridView,然后蛋疼的发现经常卡死...一开始以为是读写冲突的原因,然后就加了锁,问题依旧...然后发现每次出现滚动条的时候程序才会无响应,所以感觉应该是 ...

  7. c#中多线程写DataGridView出现滚动栏导致程序卡死(无响应)的解决的方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013529927/article/details/24225567 由于写的程序涉及到多线程维护一 ...

  8. Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题

    rumtime程序执行中出现卡住,执行成果达不到预期的标准.查看输出流以及错误流程是否内存占满了.开两个线程来运行输出流程和错误流程. rumtime运行windows脚本执行是要添加执行环境 cmd ...

  9. vc中主线程等待子线程退出的方法

    VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...

随机推荐

  1. 用jsp实现网站登录界面的制作,并连接数据库

    课堂测试 任务需求: 撰写一篇博客 需要网站系统开发需要掌握的技术: 本次课堂测试的源程序代码: 运行结果截图: 说明课堂测试未按时完成的原因. 列出你对这门课的希望和自己的目标,并具体列出你计划每周 ...

  2. d3js data joins深入理解

    Data joins 给定一个数据数组和一个 D3 selection  我们就可以attach或者说是'join'数组中的每个数据到selection中的每个元素上. 这将使得我们的数据和可视化元素 ...

  3. Linux Kernel 4.11首个候选版本开放下载

    Linus Torvalds宣布了即将到来的Linux Kernel 4.11内核分支的首个候选(RC)版本,用户可下载.编译并在自己的GNU/Linux发行版本中进行测试.Linus Torvald ...

  4. c#之反射(Reflection)

    一.反射是什么 反射就是.Net FrameWork框架为我们提供的一个帮助类库,它可以读取我们通过编译后生成的dll和exe文件里面metadate的信息. 反射可以动态的加载dll和exe文件,动 ...

  5. Mysql常用语句与函数(待续)

    -- 查询语句select class from stu_info where sid=1000000102;select * from stu_info t where t.age=88; -- t ...

  6. 未能从程序集 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Data.Entity.Build.Tasks.dll 加载任务“EntityClean”

    问题: 未能从程序集 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Data.Entity.Build.Tasks.dll 加载任务“Entity ...

  7. 超强windows10稳定Nginx绿色环境,可无限自定义PHP和mysql版本、同时运行N个版本

    转载自互联网, 小编发现最近PHPWAMP集成环境的作者Lccee,又更新了phpwamp8.8.8.8n版本 phpwamp8.8.8.8n一共集成了12个PHP版本和3个mysql版本,并且可以高 ...

  8. 类库文件引用web服务报错解决方法-在 ServiceModel 客户端配置部分中,找不到引用协定的默认终结点元素

    由于需求,需要改造原有应用,因原有应用是写在console下面的,现在需要开放至web下, 想到BIZ层应用代码都是一样的,又不想在web下在添加引用,而重复写代码,故将原有的console下的服务和 ...

  9. 为Linux设置IPTables防火墙

    我们 来讨论一下如何为你的CentOS 服务器来设置简单的防火墙. 这里我们以DigitalOcean的CentOS 6 VPS为基础来讨论的,同样也适用于 阿里云上其他类型的LINUX系统. (阿里 ...

  10. [日常]蒟蒻的高一生活 Week 4

    啊啊啊好颓啊...石乐志 (药丸...最近更新的全都是日常了...(果然只做内部题效果滑稽)) 正在考虑把日常部分从科别体改成编日体(什么鬼)反正现在每天都能更新(x OI 整个一周 $dg$ 都没有 ...