如何捕获突然终止的TThread

3
My Environment: Rad Studio XE4 using C++

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

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

我在线程的多个部分进行记录,以便可以捕获问题的原因。但是当我检查日志时,我只能发现TThread的析构函数被突然调用。

TThread的FreeOnTerminate设置为true。

程序运行两个线程。仅有一个线程突然被销毁,而另一个线程在出现问题后仍在工作。

我正在寻找如何捕获此类问题的方法。


添加 madExcept 并获取更多的调试信息。 - David Heffernan
编写一些记录代码。显然,您正在终止您的线程。 - Warren P
感谢您的评论。我不知道madExcept。我在http://qiita.com/7of9/items/3837e529237c862f670c编写了我的日志记录代码。 - sevenOfNine
1个回答

7
当我检查日志时,我发现TThread的析构函数突然被调用。 唯一可能发生这种情况的方法是: 1. 如果将线程的FreeOnTerminate属性设置为true(你已经这样做了),并且线程由于其Execute()方法退出(因为它遇到一个return语句、达到了其代码的末尾或抛出了你没有捕获的异常)而终止。要记录线程是否终止,您可以重写其虚拟DoTerminate()方法,或将OnTerminate事件处理程序分配给它。 2. 如果线程对象指针上的某些代码在线程外部调用delete。要记录是否发生这种情况,您将需要记录您的删除调用。 考虑到您确实将FreeOnTerminate设置为true,则Execute()由于未捕获的异常退出很可能是罪魁祸首。

非常感谢您的回复。在我的代码中,我没有自己删除Tthread对象。TThread是在软件启动时构造的,在软件停止进行正常操作时被析构。因此,正如您所写的,未捕获的异常似乎导致了这个问题。我会考虑通过某种方式捕获异常来解决这个问题(也许尝试try、catch并调试输出错误消息)。 - sevenOfNine
我也会像你建议的那样学习DoTerminate()和OnTerminate事件处理程序。 - sevenOfNine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接