关于执行中的子线程又被主线程多次调用其Execute方法的问题(5分)

  • 主题发起人 主题发起人 terrace
  • 开始时间 开始时间
T

terrace

Unregistered / Unconfirmed
GUEST, unregistred user!
问题1:当子线程未执行完时,主线程又调用了一次或多次该子线程的Execute方法,会怎么样(主线程会阻塞吗?子线程会有多个Execute方法同时执行吗)?问题2:是否需要在子线程的Execute中用临界区来保护?问题3:如何判断一个线程的Execute方法已经执行结束?
 
我想不会的,除非你的主线程和子线程存在相互等待的情况就会死锁了。
判断线程结束在delphi有点问题,一般是在主线程退出函数中通知子线程退出,然后使用waitfor来等待子线程退出的信号量。(注:子线程退出的最后一个语句是设置信号量)。
如果在设定的时间等待不到信号量就直接杀死子线程再退出整个程序。
 
楼上朋友:
我的主要问题是,当子线程未执行完时,主线程又调用了一次或多次该子线程的Execute方法,会怎么样(子线程会有多个Execute方法同时执行吗)?
另外Execute执行结束并不意味着线程结束(如可以设置FreeOnTerminate:=false),我想知道的是如何判断一个线程的Execute方法已经执行结束?
谢谢!
 
1.主线程永远没有必要调用TThread.Execute,虽然没有禁止这样做,即使调用了运行的空间也在主线程中(与主线程调用普通过程没两样),但多半你这么做会造成主线程和子线程的冲突(除非你保护了所有可能冲突的变量)。
2.Execute的结束也就意味着线程的结束。“Execute执行结束并不意味着线程结束”完全是错误的理解。 至于FreeOnTerminate设置的只是是否自动释放TThread的实例,FreeOnTerminate = True时当Execute结束后会自动调用Free释放TThread的实例,而=False时不会,一般设置成False是为了让主进程在线程结束后还能访问TThread中的某些变量,但是此时的TThread和一个普通结构已经没有多大区别了,它已经失去了作为TThread的最基本功能----在线程中运行代码。
 
如果主线程调用 子线程的 Execute
只是相当于主线程调用了一个函数
还是单线程的。
主线程不应该这样调用线程的 Execute
除非你觉得有这个必要
一般用 挂起/运行/销毁
Suspend Resume Terminate
 
不可能发生上述情况,只会启动线程一次。
 
后退
顶部