2012-02-10 181 views
1

Delphi中是否有任何模拟指定某个线程是后台线程?至于.NET我可以说SomeThread.IsBackground = true;和这个线程将成为背景。 在此先感谢!delphi中的后台线程

+3

在Delphi中,除主线程以外的每个线程都是后台线程。这就是为什么你只能从主线程更新GUI。 – jpfollenius 2012-02-10 10:52:58

+0

在Windows中,没有什么像“后台线程”。您可以指定一个线程优先级(SetThreadPriority),以便在需要时(即生成和打印报告的线程的优先级可能低于处理用户输入的主线程的优先级),使某些线程被更多“关键”线程预占。看起来,.NET实现采用了简化的方法,当程序退出时它会“杀死”后台线程(由于GC而起作用),恕我直言,这是一种危险的方法,线程在可能时应该干净地退出。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100(v=vs.85).aspx – 2012-02-10 13:37:25

+0

如果程序退出,则线程应该在完全必要时彻底退出,例如。以确保线程已经写入的文件被刷新。如果没有明确的理由来执行干净的退出,为什么要麻烦? – 2012-02-10 13:47:58

回答

8

在.NET文档描述IsBackground属性是这样的:

线程可以是一个背景线程或前台线程。后台线程与前台线程完全相同,只是后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程都终止,公共语言运行库就结束该进程。任何剩余的后台线程都会停止并且无法完成。

Delphi过程在.dpr文件中的主函数完成时终止。这个主函数总是在主进程线程的上下文中运行,即进程启动时系统自动创建的线程。

因此,在德尔福没有相应的财产。有一个前景线程,主线程和所有其他线程都是使用.net术语的后台线程。线程无法在运行时将状态从前景更改为背景,反之亦然。

3

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

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

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

1

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