在德尔福的背景线程

时间:2012-02-10 10:48:57

标签: multithreading delphi threadpool

是否有任何类似的Delphi指定某些线程是后台线程?至于.NET,我可以说SomeThread.IsBackground = true;,这个帖子将成为后台。 提前谢谢!

3 个答案:

答案 0 :(得分:8)

.net文档描述了IsBackground属性,如下所示:

  

线程是后台线程或前台线程。后台线程与前台线程相同,除了后台线程不会阻止进程终止。一旦属于进程的所有前台线程终止,公共语言运行库就结束该进程。任何剩余的后台线程都会停止并且不会完成。

当.dpr文件中的main函数完成时,Delphi进程终止。此主函数始终在主进程线程的上下文中运行,即在进程启动时由系统自动创建的线程。

所以,在Delphi中没有等价的属性。有一个前台线程,主线程,所有其他线程都是后台线程,使用.net术语。线程不能在运行时将状态从前景更改为背景,反之亦然。

答案 1 :(得分:3)

要验证当前线程是否为主VCL线程,请检查TThread.CurrentThread.ThreadID = MainThreadID(*)。主VCL线程应该保留前台线程,并且是唯一应该更新GUI的线程,所以你的问题的答案是“不”。

如果您使用的是最新版本的Delphi,则可以使用TThread.CreateAnonymousThread和TThread.Synchronize,以便分别在后台线程或主VCL线程中执行匿名方法。

*)请注意,CurrentThread类属性仅添加了几个版本。如果您使用的是旧的Delphi版本,例如Borland Delphi 7,则只能在线程的execute方法(或者Execute等调用的任何方法)中执行此检查。

答案 2 :(得分:1)

在Delphi中,除主线程之外的每个线程都是后台线程。这就是为什么你只能从主线程更新GUI。