您的位置:首页 > 编程语言 > Delphi

Delphi主线程重入而导致程序卡死的解决方案

2014-09-10 21:07 239 查看
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(0);

Sleep(1);
end;
FreeAndNil(AThread);


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

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

不过包含的单元不一样:

uses System.SyncObjs,
{$ifdef MSWINDOWS}
Windows;
{$endif}
{$ifdef POSIX}
Posix.Pthread;
{$endif}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐