Multithreading TThread.OnTerminate执行线程
Multithreading TThread.OnTerminate执行线程,multithreading,delphi,tthread,Multithreading,Delphi,Tthread,TThread.OnTerminate的Delphi帮助说明: 分配给OnTerminate事件的方法在主线程的上下文中执行,而不是在被终止线程的上下文中执行 当线程是在主线程之外的另一个线程中创建时,情况是否如此 那么,是在创建TThread的线程中调用OnTerminate,还是在主线程中调用?IDE没有告诉我这一点。调试时,在OnTerminate事件中看不到活动线程:-/ 文档是正确的。默认情况下,OnTerminate事件处理程序始终在主线程中运行。在内部,TThread.DoTerm
TThread.OnTerminate
的Delphi帮助说明:
分配给OnTerminate事件的方法在主线程的上下文中执行,而不是在被终止线程的上下文中执行
当线程是在主线程之外的另一个线程中创建时,情况是否如此
那么,是在创建
TThread
的线程中调用OnTerminate
,还是在主线程中调用?IDE没有告诉我这一点。调试时,在OnTerminate
事件中看不到活动线程:-/ 文档是正确的。默认情况下,OnTerminate
事件处理程序始终在主线程中运行。在内部,TThread.DoTerminate()
(在线程的Execute()
方法退出后调用)使用TThread.Synchronize()
调用处理程序:
函数ThreadProc(Thread:TThread):整数;
变量
...
开始
...
尝试
如果不是线程,则终止
尝试
线程。执行;
除了
...
结束;
最后
...
Thread.DoTerminate;
...
结束;
结束;
程序TThread.DoTerminate;
开始
如果已分配(FontTerminate),则同步(CallOnTerminate);
结束;
过程TThread.CallOnTerminate;
开始
如果指定(FOnTerminate),则为FOnTerminate(Self);
结束;
如果希望OnTerminate
处理程序在终止线程(或您想要的任何其他线程)的上下文中运行,只需重写DoTerminate()
即可调用处理程序,例如:
类型
TMyThread=class(TThread)
...
受保护的
...
程序执行;推翻
程序终止;推翻
...
结束;
程序TMyThread.Execute;
开始
...
结束;
程序TMyThread.DoTerminate;
开始
//在这里你想做什么就做什么,但不要打电话给我!
如果已分配(OnTerminate),则为OnTerminate(Self);
结束;
调试时,实际上可以在IDE中看到线程的ID。调用堆栈、监视列表和局部变量面板都显示当前线程ID。我刚刚尝试在线程的OnTerminate
处理程序中添加一个断点,可以看到它的线程ID是12888。如果我在一些GUI代码(比如按钮的OnClick
处理程序、主窗体的OnCreate
处理程序、菜单项处理程序等)中设置断点,我会看到主GUI线程是12888。因此,我的结论是。。。好吧,我想你能猜出来!:)