我写了一个不可视控件,内部有个线程(用的是BeginThread,未用TThread),
线程函数的参数就是“Self”:BeginThread(nil,0,@_WkrThreadProc,Pointer(Self),CREATE_SUSPENDED,dwThreadId);另外控件有个私有的用AllocateHWnd()建立的隐藏窗口。
使用者调用控件的Start()方法后,Start()内启动线程,线程在工作中,不断用
PostMessage投递自定义的消息到隐藏窗口(线程退出前的最后一个消息是自定义
的WM_THREAD_END),隐藏窗口的窗口过程处理消息并调用事件点火代码触发事件,
WM_THREAD_END消息仅仅就是触发控件的OnEnd(Sender: TObject)事件,没有其他代码。控件的destructor中先等待线程的结束(如果线程还在运行),清理一些成员,
然后DeallocateHWnd隐藏窗口,-----------------------------
我的问题是:如果使用者动态创建控件,并在在控件的OnEnd事件里把控件自身销毁,
比如Sender.Free()是安全的吗?
线程函数的参数就是“Self”:BeginThread(nil,0,@_WkrThreadProc,Pointer(Self),CREATE_SUSPENDED,dwThreadId);另外控件有个私有的用AllocateHWnd()建立的隐藏窗口。
使用者调用控件的Start()方法后,Start()内启动线程,线程在工作中,不断用
PostMessage投递自定义的消息到隐藏窗口(线程退出前的最后一个消息是自定义
的WM_THREAD_END),隐藏窗口的窗口过程处理消息并调用事件点火代码触发事件,
WM_THREAD_END消息仅仅就是触发控件的OnEnd(Sender: TObject)事件,没有其他代码。控件的destructor中先等待线程的结束(如果线程还在运行),清理一些成员,
然后DeallocateHWnd隐藏窗口,-----------------------------
我的问题是:如果使用者动态创建控件,并在在控件的OnEnd事件里把控件自身销毁,
比如Sender.Free()是安全的吗?
解决方案 »
- 请ghyghost(爱国人士)进,问个小问题。
- 请问如何判断一个指定进程是由哪个用户启动的? 急! 100分!
- ListView里面上下移动Item的问题
- 请教高手分不够现场加
- 关于为指针分配空间的问题(GetMem)
- 不懂的系统错误提示,还希望高手指点一二:The dspLinkUpdateError method referenced by dspLink.OnUpdateError has an incompatible pa
- 求助!!!怎样打印信封?
- 紧急求救!
- Delphi Ado 讨论!
- 蛇精病了了
- 怎样将一个字符串保存进定义为BLOB的列中?
- 如何获得dbgrid的只是双击行的事件,双击dbgrid其它的区域不激发事件???
第一感觉没问题其实你的 控件的OnEnd事件, 已经是在对应窗口的线程中调用,估计这里问题不大,
关键是你的destructor 中有否正确释放资源
handler is called from the object itself, which is still alive at that
time, and therefore it is potentially dangerous to delete it. It's OK to
delete if you are sure that the method where the event is fired from no
longer refers to any of the member variables (or resources). However, I strongly recommand the following alternative:pIOleObject->Close(); //notify the object, so it can close itself gracefully
pIOleObject->Release();//free the object
“在一个窗口的消息处理回调函数中销毁此窗口”这个问题上。-------------------------------------------
>>控件的destructor中先等待线程的结束(如果线程还在运行),清理一些成员>>是不是線程結後再執行destructor的其它的代碼呀.不是,是这样:destructor TMyComp.Destroy;
begin
//等待线程结束 //清理成员 Classes.DeallocateHWnd(_NotifyWnd); inherited;
end;
来释放,一般用close, free 之类的,然后,再“从容”释放