multithreading - TThread.OnTerminate 执行线程
问题描述
Delphi 帮助TThread.OnTerminate
指出:
分配给 OnTerminate 事件的方法在主线程的上下文中执行,而不是在被终止线程的上下文中执行。
甚至在主线程之外的另一个线程中创建线程时也会出现这种情况吗?
那么,是在OnTerminate
创建 的线程中调用TThread
,还是在主线程中调用?IDE 没有告诉我这一点。调试时,我在OnTerminate
事件中看不到活动线程。:-/
解决方案
文档是正确的。默认情况下,OnTerminate
事件处理程序始终在主线程中运行。在内部,TThread.DoTerminate()
(在线程的Execute()
方法退出后调用)用于TThread.Synchronize()
调用处理程序:
function ThreadProc(Thread: TThread): Integer;
var
...
begin
...
try
if not Thread.Terminated then
try
Thread.Execute;
except
...
end;
finally
...
Thread.DoTerminate;
...
end;
end;
procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;
procedure TThread.CallOnTerminate;
begin
if Assigned(FOnTerminate) then FOnTerminate(Self);
end;
如果您希望OnTerminate
处理程序在终止线程(或您想要的任何其他线程)的上下文中运行,您可以简单地覆盖DoTerminate()
以调用您想要的处理程序,例如:
type
TMyThread = class(TThread)
...
protected
...
procedure Execute; override;
procedure DoTerminate; override;
...
end;
procedure TMyThread.Execute;
begin
...
end;
procedure TMyThread.DoTerminate;
begin
// do whatever you want here, but DON'T call inherited!
if Assigned(OnTerminate) then OnTerminate(Self);
end;
推荐阅读
- azure - Set-AzStorageBlobContent:找不到指定的文件
- google-cloud-platform - 从 Task 检查 Google Cloud Task Queue 重试参数
- python-3.x - 将 tkinter 模块的 Listbox 小部件中的每个元素放入单独的行单元格中
- javascript - 旋转平移的元素会移动元素
- excel-formula - 从表格中可用的数据中获得准确结果的公式
- c++ - 有没有办法从一个函数全局声明一个可变大小的向量?
- visual-studio - 使用 Qemu 在 Ubuntu 上的 Visual Studio Professional 远程调试 Arm64 程序
- sql - SQL Server 透视所有表列
- html - Flex div 没有占据其父级的全高
- apache - .htaccess Vanity/Nice URLs 导致 404 错误成为主页