请问BCB多线程终止

richedit 2010-06-02 07:39:05
如果一个线程结束了,它会自动把terminated这个属性置为true还是要自己手动调用terminate函数呢?为什么我要取得这个属性的值时提示错误说这个属性unaccessible呢?

还有Onterminate事件函数,如果有两个参数,怎么调用呢?MyThread->Onterminate=Onterminatefunction;的话不行,但是第一个参数TObject *Sender,这个Sender是什么啊?

Thanks so much
...全文
803 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzbinfo 2010-06-04
  • 打赏
  • 举报
回复
学习一下
richedit 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ccrun 的回复:]
1. 线程结束时,会自动将Terminated属性设为true
2. Terminated属性是TThread类的非public属性,所以只能在线程类的成员函数中访问,外部成员访问就会提示不能访问
3. OnTerminate属性是一个TNotifyEvent值, 其实就是指向一个函数的地址. 其原型如下:

C/C++ code
typedef void __fastcall (__c……
[/Quote]

谢谢~~~

onterminate的事件处理函数是在主线程中吧,我查的资料是这样说的,而且这样也确实方便处理

那个参数,我看delphi的一个讲多线程的例子,是不能有参数的,不知道BCB是不是也是这样?原文如下:

在VCL中,我们可以用两种方法,一种是向主线程中的窗体发送消息,另一种是使用异步事件。第一种方法其实没有第二种来得方便。想想线程类中的OnTerminate事件,这个事件由线程函数的堆栈引起,却在主线程执行。
事实上,真正的线程函数是这个:
function ThreadProc(Thread: TThread): Integer;
函数里面有Thread.Execute,这就是为什么Execute是在其他线程中执行,该方法执行之后,有如下语句:
Thread.DoTerminate;
而线程类的DoTerminate方法里面是
if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
显然Synchronize方法使得CallOnTerminate在主线程中执行,而CallOnTerminate里面的代码其实就是:
if Assigned(FOnTerminate) then FOnTerminate(Self);
只要Execute方法一执行完就发生OnTerminate事件。不过有一点是必须注意,OnTerminate事件发生后,线程类不一定会释放,只有在FreeOnTerminate为True之后,才会Thread.Free。看一下ThreadProc函数就知道。
依照Onterminate事件,我们可以设计自己的异步事件。
Synchronize方法只能传进一个无参数的方法类型,但我们的事件经常是要带一些参数的,这个稍加思考就可以得到解决,即在线程类中保存参数,触发事件前先设置参数,再调用异步事件,参数复杂的可以用记录或者类来实现。

lghndyz 2010-06-03
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1436131,多线程的例子!!
xjq2003 2010-06-02
  • 打赏
  • 举报
回复
MyThread->Terminat();
ccrun.com 2010-06-02
  • 打赏
  • 举报
回复
1. 线程结束时,会自动将Terminated属性设为true
2. Terminated属性是TThread类的非public属性,所以只能在线程类的成员函数中访问,外部成员访问就会提示不能访问
3. OnTerminate属性是一个TNotifyEvent值, 其实就是指向一个函数的地址. 其原型如下:
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

VCL中大部分事件处理函数必须是类的成员函数. 也就是说, 如果要处理一个线程的OnTerminate事件,就要定义一个类似:
void __fastcall TMyThread::OnTerminate(TObject *Sender)
{
// Do something...
}
然后接管线程的OnTerminate事件:
MyThread->OnTerminate = (TNotifyEvent)&OnTerminate;
4. 参数中的Sender是指发送者, 通常代表触发该事件的对象.
周药师 2010-06-02
  • 打赏
  • 举报
回复
設置FreeOnTerminate=true; 现成会自動釋放
贴你的代码看看

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧