Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading TThread.OnTerminate执行线程_Multithreading_Delphi_Tthread - Fatal编程技术网

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。因此,我的结论是。。。好吧,我想你能猜出来!:)