关于多线程的困惑!

searoom 2012-08-26 05:24:12
我建了一个线程类,程序大部分地方都用的挺好的,可是有一个地方在调用时,Thread.OnTerminate 死活没有执行

我可以理解为 Execute 中的代码没有执行完毕的原因么?

可是我测试一下,哪怕在 Execute 中仅仅使用 sleep(2000) ,还是不会执行到 OnTerminate 。

我在另外一个模块程序里面调用时又完全正常,实在搞不懂为什么

想请教各位,Thread.OnTerminate 有什么情况下不会被执行啊?
...全文
216 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

这个是不是涉及到 线程与主进程 的内存管理的问题?欢迎大家讨论一下啊

1. 线程中创建的全局对象,内存管理上和主进程创建的有区别吗?有什么区别?
2. 是不是意味着线程中尽可能不要对全局变量的生命周期做干预?(当然是在控制好了同步访问的情况下)


to unsigned:
只是 COM 套件存在此问题吗?普通类呢?
[/Quote]
COM对象资源,不管进程内还是进程外,与普通的内存共享是不同的。如果有空的话可以去做个深入了解。
wzwcn 2012-08-27
  • 打赏
  • 举报
回复
线程里用ADO最好是一个线程创建一个ADOConnection,如果共用的话要加锁。还有,创建ADOconnection时要先Coinitialize(nil),不过记得相应的调用CoUninitialize
searoom 2012-08-27
  • 打赏
  • 举报
回复
这个是不是涉及到 线程与主进程 的内存管理的问题?欢迎大家讨论一下啊

1. 线程中创建的全局对象,内存管理上和主进程创建的有区别吗?有什么区别?
2. 是不是意味着线程中尽可能不要对全局变量的生命周期做干预?(当然是在控制好了同步访问的情况下)


to unsigned:
只是 COM 套件存在此问题吗?普通类呢?
僵哥 2012-08-26
  • 打赏
  • 举报
回复
COM套间的问题。

对于主线程默认有一个COM套间的初始化,如果有必要可以进行反初始化,之后重新初始化为多线程套间,同时子线程也初始化为多线程套间,这样就可以共享ADO对象实例了。
searoom 2012-08-26
  • 打赏
  • 举报
回复
找到原因了,是由于我之前在多线程中创建了一个全局对象,然后主程序再使用该全局对象时,有错误,我改成在主进程中创建好该对象就没问题了。

很奇怪的是,其它方面好像都没问题,只是使用该全局对象执行一个多线程任务就出现上述问题了
感觉子线程中创建全局对象不是一个正确的做法,比如子线程创建 TAdoConnection 等对象在主进程中都会有错误。

求解答说明
蓝色光芒 2012-08-26
  • 打赏
  • 举报
回复
在Sleep(2000)上下个断点,看执行了没,先确定这个执行了再说后面的.

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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