delphi - 如何捕获突然破坏的TThread

标签 delphi c++builder tthread

My Environment: Rad Studio XE4 using C++

我正在开发一个使用 TThread 的软件。最近,我遇到一个问题,在程序启动几天后,TThread 突然被破坏。

在 TThread 中,线程使用 Synchronize() 方法更改表单(例如 TLables)的显示。我想知道这可能会导致一些问题。

我正在记录线程中的多个部分,以便能够找出问题的原因。但是当我检查日志时,我只能发现TThread的析构函数突然被调用了。

TThread 的 FreeOnTerminate 设置为 true。

程序运行两个线程。只有一个线程突然被破坏,而另一个线程在问题发生后仍在工作。

我正在寻找如何找出此类问题的原因。

最佳答案

when I check the log, I can only find that the destructor of the TThread is suddenly called.

唯一可能发生的方式是:

  1. 如果您将线程的 FreeOnTerminate 属性设置为 true(您确实如此),并且您的线程由于其 Execute() 方法退出而终止(或者因为它遇到了 return 语句、到达了代码末尾,或者引发了您未捕获的异常)。要记录线程是否正在终止,您可以重写其虚拟 DoTerminate() 方法,或为其分配一个 OnTerminate 事件处理程序。

  2. 如果线程外部的某些代码正在线程对象指针上调用delete。要记录是否发生这种情况,您必须记录 delete 调用。

鉴于您FreeOnTerminate设置为true,那么可能的罪魁祸首是Execute()由于未捕获的异常而退出。

关于delphi - 如何捕获突然破坏的TThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251103/

相关文章:

json - 如何更改 REST DataSnap 中的内容类型响应

Delphi 2007 - 如果设置 "system-wide",则系统范围热键不是 "MainFormOnTaskBar := True"

mysql - Zeoslib : How to tell when query execution is complete?

c++ - ILINK32 错误 : Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX. obj 的原因?

delphi - CRC-CCITT (0xFFFF) 功能?

c++ - 使用 C++Builder 后期绑定(bind) COM 对象

delphi - Delphi 中的线程消息循环挂起

multithreading - 使用 Delphi XE7 并行库

delphi - 我可以在 TThread 的 OnTerminate 事件中引发异常吗?

c++ - 创建键值对 Borland C++