2012-02-10 177 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。